【问题描述】[第680题][验证回文字符串Ⅱ][简单]

给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。示例 1:输入: "aba"
输出: True
示例 2:输入: "abca"
输出: True
解释: 你可以删除c字符。
注意:字符串只包含从 a-z 的小写字母。字符串的最大长度是50000。

【解答思路】

考虑最朴素的方法:首先判断原串是否是回文串,如果是,就返回 true;如果不是,则枚举每一个位置作为被删除的位置,再判断剩下的字符串是否是回文串。这种做法的渐进时间复杂度是 O(n^2)的,会超出时间限制。

首先考虑如果不允许删除字符,如何判断一个字符串是否是回文串。常见的做法是使用双指针。定义左右指针,初始时分别指向字符串的第一个字符和最后一个字符,每次判断左右指针指向的字符是否相同,如果不相同,则不是回文串;如果相同,则将左右指针都往中间移动一位,直到左右指针相遇,则字符串是回文串。

在允许最多删除一个字符的情况下,同样可以使用双指针,通过贪心算法实现。初始化两个指针 low 和 high 分别指向字符串的第一个字符和最后一个字符。每次判断两个指针指向的字符是否相同,如果相同,则更新指针,令 low = low + 1 和 high = high - 1,然后判断更新后的指针范围内的子串是否是回文字符串。如果两个指针指向的字符不同,则两个字符中必须有一个被删除,此时我们就分成两种情况:即删除左指针对应的字符,留下子串 s[low + 1], s[low + 1], …, s[high],或者删除右指针对应的字符,留下子串 s[low], s[low + 1], …, s[high - 1]。当这两个子串中至少有一个是回文串时,就说明原始字符串删除一个字符之后就以成为回文串。

1. 贪心算法

时间复杂度:O(N^2) 空间复杂度:O(1)

class Solution {public boolean validPalindrome(String s) {int low = 0, high = s.length() - 1;while (low < high) {char c1 = s.charAt(low), c2 = s.charAt(high);if (c1 == c2) {low++;high--;} else {boolean flag1 = true, flag2 = true;for (int i = low, j = high - 1; i < j; i++, j--) {char c3 = s.charAt(i), c4 = s.charAt(j);if (c3 != c4) {flag1 = false;break;}}for (int i = low + 1, j = high; i < j; i++, j--) {char c3 = s.charAt(i), c4 = s.charAt(j);if (c3 != c4) {flag2 = false;break;}}return flag1 || flag2;}}return true;}
}
2. 递归算法

时间复杂度:O(N) 空间复杂度:O(1)

 public boolean validPalindrome(String s) {int front = 0;int end = s.length() - 1;// < 符号,中间一个字符不影响回文与否while (front < end) {if (s.charAt(front) != s.charAt(end)) {return validPalindromeHelper(s, front + 1, end) || validPalindromeHelper(s, front, end - 1);}front++;end--;}return true;}public boolean validPalindromeHelper(String s, int front, int end) {while (front < end) {if (s.charAt(front) != s.charAt(end)) {return false;}front++;end--;}return true;}

【总结】

1. 数组题目
  • 暴力思考优化
  • 考虑清楚边界 防止溢出
  • 多立flag
  • 递归解决
2. 判断回文串模板
    public boolean validPalindromeHelper(String s, int front, int end) {while (front < end) {if (s.charAt(front) != s.charAt(end)) {return false;}front++;end--;}return true;}
3.比较字符串中某些位置是否相等

**方法一:Java charAt() 方法
// s.charAt(i) 每次都会检查数组下标越界
public char charAt(int index)

方法二:转换成字符数组再用下标进行判断

    char[] charArray = s.toCharArray();

转载链接:https://leetcode-cn.com/problems/valid-palindrome-ii/solution/yan-zheng-hui-wen-zi-fu-chuan-ii-by-leetcode-solut/

[Leedcode][JAVA][第680题][验证回文字符串Ⅱ][贪心][递归]相关推荐

  1. [Leedcode][JAVA][第125题][验证回文串][双指针][String]

    [问题描述][简单] 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写.说明:本题中,我们将空字符串定义为有效的回文串.示例 1:输入: "A man, a p ...

  2. leetcode系列--680.验证回文字符串 Ⅱ

    leetcode系列–第680题.验证回文字符串 Ⅱ 给定一个非空字符串 s,最多删除一个字符.判断是否能成为回文字符串. 输入: s = "abca" 输出: true 解释: ...

  3. 1706. 球会落何处 / 680. 验证回文字符串 Ⅱ

    1706. 球会落何处[中等题][每日一题] 思路: 单看每一行,必须是小球所在的列跟它左右两侧至少有一侧的挡板方向相同才能使小球滚动下去,否则就卡住了,具体点说就是,设小球当前所在列下标为i,那么如 ...

  4. 680. 验证回文字符串 Ⅱ

    680. 验证回文字符串 Ⅱ 给定一个非空字符串 s,最多删除一个字符.判断是否能成为回文字符串. 示例 1: 输入: s = "aba" 输出: true 示例 2: 输入: s ...

  5. 力扣--125验证回文串/680验证回文字符串II

    125验证回文串 python代码 常规 def isPalindrome(s):if len(s) < 2:return TruesList = []s = s.lower()print(s) ...

  6. 680. 验证回文字符串 Ⅱ golang

    题目 验证回文字符串 Ⅱ 给定一个非空字符串 s,最多删除一个字符.判断是否能成为回文字符串. 示例 1: 输入: "aba" 输出: True 示例 2: 输入: "a ...

  7. 20190821:(leetcode习题)验证回文字符串

    验证回文字符串 题目 大致思路 代码实现 题目 大致思路 首先明确什么是回文字符串: 正序和反序读,是一回事的句子,就是回文字符串 当然,你得把里面除了数字和字母的元素去掉,比如逗号啊,句号啊,之类的 ...

  8. LeetCode 680. 验证回文字符串 Ⅱ

    1. 题目 给定一个非空字符串 s,最多删除一个字符.判断是否能成为回文字符串. 示例 1: 输入: "aba" 输出: True示例 2: 输入: "abca" ...

  9. LeetCode 680 验证回文字符串 Ⅱ

    题目描述 给定一个非空字符串 s,最多删除一个字符.判断是否能成为回文字符串. 题解 使用双指针进行遍历,不满足条件则进行删除,由于不知道要删除哪一个,则均进行判断. 代码 class Solutio ...

最新文章

  1. Linux下常用文本处理命令
  2. 关于Linux的总结(三)
  3. 二 jQuery 语法
  4. BlazeDS入门教程-很详细-赞原创作者一个
  5. android richtext显示html,【报Bug】关于rich-text显示html 的问题
  6. linux内核那些事之虚拟空间划分
  7. 蔬菜名称大全500种_96种室内盆栽植物图片及名称,室内植物品种大全
  8. [图灵程序设计丛书].持续交付:发布可靠软件的系统方法.pdf
  9. 15 行 Java 代码实现一个标准输出的进度条,其中的知识点你知道但并不一定会用...
  10. 织梦dedecms调用热门搜索关键词的方法
  11. 数商云跨境电商平台解决方案
  12. C# HttpClientHelper
  13. Java整合FFmpeg截取视频某一帧为图片
  14. 主题:一个中专生:我在华为面试的真实经历,转http://www.javaeye.com/topic
  15. obs 推流编码在哪设置_OBS Studio基本设置
  16. Mac开发-公证流程记录Notarization-附带脚本
  17. pageinspect
  18. matlab计算图片基频,复倒频谱 - 基频估计
  19. 软件测试 | 测试开发 | Real Distributed APEX
  20. 【软件】企业管理解决方案SAP

热门文章

  1. ArcGIS生成根据点图层生成等值面并减小栅格锯齿的操作步骤
  2. Java2实用教程(第二版)程序代码——第十四章 Component类的常用方法
  3. 私有5g网络_Verizon与诺基亚合作部署私有5G网络
  4. RabbitMQ六种队列模式-简单队列模式
  5. 微信小程序开发实战基础一、页面跳转,底部导航栏,分享,加载图片标签,列表
  6. Win XP必须禁止的服务
  7. Linux下部署多个Tomcat
  8. php 页面加载进度条,HTML5/CSS3 网页加载进度条的实现,下载进度条等经典案例
  9. Web中Servlet
  10. Mybatis insert返回主键ID