栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Leetcode #680.验证回文字串 Ⅱ

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Leetcode #680.验证回文字串 Ⅱ

目录
    • 算法:双指针
    • 思路
    • C++代码
    • Java代码
    • 总结

算法:双指针

题目描述:可以删除一个字符,判断是否能构成回文字符串。

输入: s = "abca"
输出: true
解释: 你可以删除c字符。

输入: s = "abc"
输出: false
思路

回味字串:即左右对称的字符串形如“aba、abcba”;
所以我们很容易想到用双指针来判断,每次只需要判断左右指针的值是否相等,如果能走到最后即为一个回文子串。
但是这仅仅是个开始,题目上说可以删除一个字符;

在试着删除字符时,我们既可以删除左指针指向的字符,也可以删除右指针指向的字符。

C++代码
class Solution {
public:
    bool validPalindrome(string s) {
        int n = s.length();
        int i = 0 , j = n - 1;
        while (i <= j) {
            if (s[i] != s[j]) return isPalindrome(s, i, j - 1) || isPalindrome(s, i + 1, j);
            else {
                i ++ ;
                j -- ;
            }
        } 
        return true ;
    }
    bool isPalindrome(string s , int i , int j) {
        while (i < j) {
            if (s[i++] != s[j--]) return false ;
        }
        return true ;
    }
};
Java代码
class Solution {
    public boolean validPalindrome(String s) {
        int n = s.length();
        int i = 0 , j = n - 1;
        while (i <= j ) {
            if (s.charAt(i) != s.charAt(j)) return isPalindrome(s, i, j - 1) || isPalindrome(s, i + 1, j);
            else {
                i ++ ;
                j -- ;
            }
        }
        return true;
    }
    public boolean isPalindrome (String s,int i,int j ) {
        while (i <= j) {
            if (s.charAt(i++) != s.charAt(j--)) return false ;
        }
        return true;
    }
}
总结

本题关键在于对双指针的理解和灵活运用,尤其是处理删除一个字母时。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/318490.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号