这是悦乐书的第287次更新,第304篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第155题(顺位题号是680)。给定非空字符串s,最多可以删除一个字符。 判断它是否是回文。例如:

输入:“aba”
输出:true

输入:“abca”
输出:true
说明:可以删除字符“c”让其变为回文。

注意:该字符串仅包含小写字符a-z。 字符串的最大长度为50000。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

暴力解法。首先,如果字符串长度在2以内,直接返回true。然后利用StringBuilder类,借助其reverse方法,判断是否为回文。如果上面两种情况都不满足,就使用循环,每次对原字符串进行截取,来实现删掉一位的效果,组成新的字符串来判断是否为回文。但是此解法会超时。

public boolean validPalindrome(String s) {if (s.length() <= 2) {return true;}StringBuilder sb = new StringBuilder(s);String ss = sb.reverse().toString();if (s.equals(ss)) {return true;}for (int i=0; i<s.length(); i++) {if (i == 0) {if (isPalindrome(s.substring(1, s.length()))) {return true;}} else if (i < s.length()-1) {if (isPalindrome(s.substring(0, i)+ s.substring(i+1, s.length()))) {return true;}} else if (i == s.length()-1) {if (isPalindrome(s.substring(0, s.length()-1))) {return true;}}}return false;
}public boolean isPalindrome(String ss){StringBuilder sb = new StringBuilder(ss);String sss = sb.reverse().toString();if (ss.equals(sss)) {return true;}return false;
}

03 第二种解法

第一种解法会超时,因为考虑了所有可能存在的多余的那个字符,但是我们真的需要考虑那么多吗?因为题目说了,只有一次删除字符的机会,那么我们在处理的时候,只处理一种情况就好,不符合就直接返回false。

依旧使用截取字符串的方式,如果遇到左右字符不对称的情况,就表示遇到了多余的字符,此时需要考虑是删掉左边的还是右边的?只要两个中符合一个就可以返回true,所以用或连接。将左右两字符不等的索引范围内的字符串进行截取,一个后面少截取一位,一个前面少截取一位,判断截取的字符串是否为回文。

public boolean validPalindrome(String s) {if (s.length() <= 2) {return true;}StringBuilder sb = new StringBuilder(s);String ss = sb.reverse().toString();if (s.equals(ss)) {return true;}for (int i=0; i<s.length()/2; i++) {if (s.charAt(i) != s.charAt(s.length()-1-i)) {return isPalindrome(s.substring(i, s.length()-1-i)) || isPalindrome(s.substring(i+1, s.length()-i));}}return true;
}public boolean isPalindrome(String ss){StringBuilder sb = new StringBuilder(ss);String sss = sb.reverse().toString();if (ss.equals(sss)) {return true;}return false;
}

04 第三种解法

思路与第二种解法相似,但是比较轻便,借助双指针来实现。一左一右取字符比较,如果不等,表示遇到了需要删除的字符,同样分两种情况,删右边的一位和删左边的一位,再去判断这中间的子字符串是否为回文即可。

public boolean validPalindrome(String s) {// 使用双指针int left = 0;int right = s.length()-1;while (left < right) {// 如果左右指针所在的字符不相等,那就删掉右边的或者删掉左边的字符,再判断if (s.charAt(left) != s.charAt(right)) {return isPalindrome(s, left, right-1) || isPalindrome(s, left+1, right);}left++;right--;}return true;
}// 辅助方法,判断一个字符串在(left,right)内是否为回文
public boolean isPalindrome(String s, int left, int right){while (left < right) {if (s.charAt(left) != s.charAt(right)) {return false;}left++;right--;}return true;
}

05 小结

算法专题目前已日更超过四个月,算法题文章155+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

转载于:https://www.cnblogs.com/xiaochuan94/p/10596796.html

LeetCode算法题-Valid Palindrome II(Java实现)相关推荐

  1. LeetCode算法题-Nth Digit(Java实现)

    这是悦乐书的第215次更新,第228篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第83题(顺位题号是400).找到无限整数序列的第n个数字1,2,3,4,5,6,7,8 ...

  2. LeetCode算法题-Design LinkedList(Java实现)

    这是悦乐书的第300次更新,第319篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第168题(顺位题号是707).设计链表的实现.您可以选择使用单链表或双链表.单链表中的 ...

  3. LeetCode算法题-Number Complement(Java实现-五种解法)

    这是悦乐书的第240次更新,第253篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第107题(顺位题号是476).给定正整数,输出其补码数.补充策略是翻转其二进制表示的位 ...

  4. LeetCode算法题-Detect Capital(Java实现)

    这是悦乐书的第251次更新,第264篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第118题(顺位题号是520).给定一个单词,你需要判断其中大写字母的使用是否正确.当下 ...

  5. leetcode算法题--Unique Paths II

    原题链接:https://leetcode.com/problems/unique-paths-ii/ class Solution {public:int uniquePathsWithObstac ...

  6. leetcode算法题--Jump Game II

    原题链接:https://leetcode.com/problems/jump-game-ii/ int jump(vector<int>& nums) {int l = 0, r ...

  7. leetcode算法题--剪绳子 II

    原题链接:https://leetcode-cn.com/problems/jian-sheng-zi-ii-lcof/ 相关题目:剪绳子 1.循环求余法 //(x ^ a) % p; long re ...

  8. leetcode算法题--螺旋矩阵 II

    原题链接:https://leetcode-cn.com/problems/spiral-matrix-ii/ 相关题目:螺旋矩阵 vector<vector<int>> ge ...

  9. leetcode算法题--环形链表 II★

    原题链接:https://leetcode-cn.com/problems/linked-list-cycle-ii/ 1.map ListNode *detectCycle(ListNode *he ...

最新文章

  1. 印钞机 V1.0(量化选基总结)
  2. Linux基础命令---comm
  3. Android 电视 文件目录,通用的安卓智能电视截屏及图片目录文件获取方法
  4. O(n)算法得到数组中第k大的数字
  5. S3C2440 WINCE6将USB DEVICE改成USB HOST,实现两个USB HOST
  6. ubuntu报错E: 无法获得锁 /var/cache/apt/archives/lock - open (11: 资源暂时不可用)E: 无法对目录 /var/cache/apt/archives/
  7. libsvm在matlab中使用的常见错误及libsvm的使用
  8. OpenShift Redhat的使用和介绍
  9. Welcome to Swift (苹果官方Swift文档初译与注解八)---53~57页(第二章)
  10. 汇编软件DOSBox使用教程
  11. 微信小程序源码分享合集-1
  12. LiJian-kaldi搭建在线语音识别系统 资料汇总
  13. 菜鸟日记(yzy) 微信公众号网页的开发基础(微信接口调用)
  14. java 图片背景色_java处理图片背景颜色的方法
  15. 有什么蓝牙耳机好用又不贵?适合学生党的平价蓝牙耳机推荐
  16. PHP 数据类型划分(8种)、获取数据(变量)的类型函数、单引号和双引号的字符串区分转义符、定界符、拓展
  17. Android应用.三星i9000系列(4).SuperOneClick获取Root权限的原理
  18. 最近使用到的linux一些命令或操作日常记录
  19. Docker 镜像使用常见雷区处理
  20. 嵌入式软件工程师介绍

热门文章

  1. 导出matlab程序,Matlab数据导入导出
  2. 在华为云服务器的Linux系统中搭建开发环境
  3. 数据结构特性解析 (四)LinkedList
  4. Matlab-运算符
  5. LeetCode 198 House Robber Python
  6. linux vi 批量修改某类字符串
  7. java数组二分查找_java 13-1 数组高级二分查找
  8. python界面散点图_Python数据可视化——散点图
  9. python的scramy架构_Scrapy的架构初探
  10. 双向链表删除节点时间复杂度_删除链表的节点(剑指offer第十七题)