这是悦乐书的第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实现)的更多相关文章

  1. LeetCode算法题-Valid Palindrome(Java实现)

    这是悦乐书的第174次更新,第176篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第33题(顺位题号是125).给定一个字符串,确定它是否是回文,只考虑字母数字字符并忽略 ...

  2. LeetCode算法题-Valid Anagram(Java实现)

    这是悦乐书的第198次更新,第205篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第61题(顺位题号是242).给定两个字符串s和t,写一个函数来确定t是否是s的anag ...

  3. LeetCode算法题-Range Addition II(Java实现)

    这是悦乐书的第271次更新,第285篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第138题(顺位题号是598).给定一个m行n列的新二维数组M,其初始值为0.提供一个二 ...

  4. LeetCode算法题-Reverse String II(Java实现)

    这是悦乐书的第256次更新,第269篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第123题(顺位题号是541).给定一个字符串和一个整数k,你需要反转从字符串开头算起的 ...

  5. LeetCode算法题-Valid Perfect Square(Java实现-四种解法)

    这是悦乐书的第209次更新,第221篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第77题(顺位题号是367).给定正整数num,写一个函数,如果num是一个完美的正方形 ...

  6. LeetCode算法题-Contains Duplicate II(Java实现)

    这是悦乐书的第193次更新,第197篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第53题(顺位题号是219).给定整数数组和整数k,找出数组中是否存在两个不同的索引i和 ...

  7. LeetCode算法题-Rotate String(Java实现)

    这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...

  8. LeetCode算法题-Rotated Digits(Java实现)

    这是悦乐书的第316次更新,第337篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第185题(顺位题号是788).如果一个数字经过180度旋转后,变成了一个与原数字不同的 ...

  9. LeetCode算法题-Toeplitz Matrix(Java实现)

    这是悦乐书的第312次更新,第333篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第181题(顺位题号是766).如果从左上角到右下角的每个对角线具有相同的元素,则矩阵是 ...

随机推荐

  1. BBS论坛(十一)

    11.1.前台用户模型创建 (1)apps/front/models.py 首先安装:pip install shortuuid class FrontUser(db.Model): __tablen ...

  2. JVM基础系列第11讲:JVM参数之堆栈空间配置

    JVM 中最重要的一部分就是堆空间了,基本上大多数的线上 JVM 问题都是因为堆空间造成的 OutOfMemoryError.因此掌握 JVM 关于堆空间的参数配置对于排查线上问题非常重要. tips ...

  3. MongoDB exception:connection failed

    根据http://www.runoob.com/mongodb/mongodb-window-install.html的教程配置了MongoDB,Mongod.exe配置为 --port 指令表明mo ...

  4. 什么是LogDashboard?

    What is LogDashboard 接上篇 LogDashboard是可视化的日志面板,摆脱了传统查看txt与数据库的方式. 使查看日志变的简单方便并且可供分析 基于Net Core中间件编写适 ...

  5. Linux命令收集

    文件处理命令:ls 功能描述:显示目录文件 命令英文原意:list 命令所在路径:/bin/ls 执行权限:所有用户 语法:  ls  选项[-ald]  [文件或目录] -a    显示所有文件,包 ...

  6. MaxCompute安全管理指南-基础篇

    背景及目的 方便和辅助MaxCompute的project owner或安全管理员进行project的日常安全运维,保障数据安全. MaxCompute有安全模型,DataWorks也有安全模型,当通 ...

  7. 第50章 设备授权端点(Device Authorization Endpoint) - Identity Server 4 中文文档(v1.0.0)

    设备授权端点可用于请求设备和用户代码.此端点用于启动设备流授权过程. 注意 终端会话端点的URL可通过发现端点获得. client_id 客户标识符(必填) client_secret 客户端密钥可以 ...

  8. C# 操作Word 中的OLE——插入、编辑、读取 OLE

    概述 OLE,Object Linking and Embedding,即对象连接与嵌入.我们在设计程序时,OLE可以用来创建复合文档,把文字.声音.图像.表格.应用程序等类型的信息组合在一起,在Wo ...

  9. python爬虫之静态网页——全国空气质量指数(AQI)爬取

    首先爬取地址:http://www.air-level.com/ 利用的python库,最近最流行的requests,BeautifulSoup. requests:用于下载html Beautifu ...

  10. Django学习之四:Django Model模块

    目录 Django Model 模型 MODEL需要在脑子里记住的基础概念 区分清楚,必须不能混淆的 class Meta 内嵌元数据定义类 简单model创建实例 数据源配置 接着通过models在 ...