LeetCode算法题-Valid Palindrome II(Java实现)
这是悦乐书的第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+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!
LeetCode算法题-Valid Palindrome II(Java实现)的更多相关文章
- LeetCode算法题-Valid Palindrome(Java实现)
这是悦乐书的第174次更新,第176篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第33题(顺位题号是125).给定一个字符串,确定它是否是回文,只考虑字母数字字符并忽略 ...
- LeetCode算法题-Valid Anagram(Java实现)
这是悦乐书的第198次更新,第205篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第61题(顺位题号是242).给定两个字符串s和t,写一个函数来确定t是否是s的anag ...
- LeetCode算法题-Range Addition II(Java实现)
这是悦乐书的第271次更新,第285篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第138题(顺位题号是598).给定一个m行n列的新二维数组M,其初始值为0.提供一个二 ...
- LeetCode算法题-Reverse String II(Java实现)
这是悦乐书的第256次更新,第269篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第123题(顺位题号是541).给定一个字符串和一个整数k,你需要反转从字符串开头算起的 ...
- LeetCode算法题-Valid Perfect Square(Java实现-四种解法)
这是悦乐书的第209次更新,第221篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第77题(顺位题号是367).给定正整数num,写一个函数,如果num是一个完美的正方形 ...
- LeetCode算法题-Contains Duplicate II(Java实现)
这是悦乐书的第193次更新,第197篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第53题(顺位题号是219).给定整数数组和整数k,找出数组中是否存在两个不同的索引i和 ...
- LeetCode算法题-Rotate String(Java实现)
这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...
- LeetCode算法题-Rotated Digits(Java实现)
这是悦乐书的第316次更新,第337篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第185题(顺位题号是788).如果一个数字经过180度旋转后,变成了一个与原数字不同的 ...
- LeetCode算法题-Toeplitz Matrix(Java实现)
这是悦乐书的第312次更新,第333篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第181题(顺位题号是766).如果从左上角到右下角的每个对角线具有相同的元素,则矩阵是 ...
随机推荐
- Python内置函数(27)——hasattr
英文文档: hasattr(object, name) The arguments are an object and a string. The result is True if the stri ...
- BBS论坛(十四)
14.1注册完成跳到上一个页面 (1)front/form.py # front/forms.py __author__ = 'derek' from ..forms import BaseForm ...
- Spring Boot 2.0 教程 | AOP 切面统一打印请求日志
欢迎关注微信公众号: 小哈学Java 文章首发于个人网站 https://www.exception.site/springboot/spring-boot-aop-web-request 本节中,您 ...
- node 调试相关
#0 node 正确的书写方式 为了防止后面出现混乱的各种书写,先来了解一下如何正确书写 node 的名称. 下面使用来自@bitandbang 推文中的图片展示如何正确书写 node 名称. nod ...
- C#3.0导航
C#3.0主要特性 智能的编译器 编译器,背后的默默付出者 Lamdba表达式与表达式树 匿名方法的革命 扩展方法 优雅的对类进扩展 (待完成) LINQ 还有这种操作? (待完成)
- 自定义的jdbc连接工具类JDBCUtils【java 工具类】
JDBCUtils 类设计: 1. 创建私有的属性*(连接数据库必要的四个变量):dreiver url user password 2. 将构造函数私有化 3.将注册驱动写入静态代码块 4.外界只能 ...
- Linux 终端下解压文件失败问题
Linux 终端下解压文件失败: # tar -zxvf *****.tar.bz2 tar 命令出错gzip: stdin: not in gzip format tar: Child return ...
- web进修之—Hibernate起步(1)(2)
想开始写博客了,尝试了CSDN和cnblog之后还是觉得cnblog更加简洁.专注(不过cnblog不支持搬家),所以把刚刚写的两篇学习博客链接放在这儿,这样这个系列也算是完整了: web进修之—Hi ...
- ES6躬行记(12)——数组
ES6为数组添加了多个新方法,既对它的功能进行了强化,也消除了容易产生歧义的语法. 一.静态方法 1)of() ES6为Array对象新增的第一个静态方法是of(),用于创建数组,它能接收任意个参数, ...
- springboot2.0.3源码篇 - 自动配置的实现,发现也不是那么复杂
前言 开心一刻 女儿: “妈妈,你这么漂亮,当年怎么嫁给了爸爸呢?” 妈妈: “当年你爸不是穷嘛!‘ 女儿: “穷你还嫁给他!” 妈妈: “那时候刚刚毕业参加工作,领导对我说,他是我的扶贫对象,我年轻 ...