首页 > 其他分享 >leetcode5-最长回文子串

leetcode5-最长回文子串

时间:2022-08-18 13:47:39浏览次数:83  
标签:子串 leetcode5 charAt int right && 回文 dp left

最长回文子串

  • 中心扩展法

从中心向两侧扩展,分为两种情况:一种是奇数长度,一种是偶数长度,需要分开讨论。

class Solution {
    public String longestPalindrome(String s) {
        int n = s.length(), left = 0, right = 0;
        for(int i = 0; i < s.length(); i++){
            int l = i, r = i;
            while(l > 0 && r < n-1 && s.charAt(l-1) == s.charAt(r+1)){
                l--;
                r++;
            }
            if(r-l > right-left){
                right = r;
                left = l;
            }
            l = i; r = i+1;
            if(r == n || s.charAt(l) != s.charAt(r))    continue;
            while(l > 0 && r < n-1 && s.charAt(l-1) == s.charAt(r+1)){
                l--;
                r++;
            }
            if(r-l > right-left){
                right = r;
                left = l;
            }
        }
        return s.substring(left, right+1);
    }
}
  • dp

维护一个二维dp数组,对于一个回文子串来说,如果j-i < 2,那么当i和j两个位置的字符相等的时候,是回文子串;如果j-i >= 2,那么除了字符串相等这个条件外,还需要满足dp[i+1][j-1] == true这个条件才能使字符串成为回文子串。
由于这里的i用到了i+1的状态,所以需要从后往前进行遍历。

class Solution {
    public String longestPalindrome(String s) {
        int n = s.length(), left = 0, right = 0;
        boolean dp[][] = new boolean[n][n];
        for(int i = n-1; i >= 0; i--){
            for(int j = i; j < n; j++){
                if(j-i < 2) dp[i][j] = s.charAt(i) == s.charAt(j);
                else
                    dp[i][j] = dp[i+1][j-1] && s.charAt(i) == s.charAt(j);
                if(dp[i][j] && j-i > right-left){
                    left = i;
                    right = j;
                }
            }
        }
        return s.substring(left, right+1);
    }
}

标签:子串,leetcode5,charAt,int,right,&&,回文,dp,left
From: https://www.cnblogs.com/xzh-yyds/p/16598397.html

相关文章

  • 区间DP の 题(内含 最长回文串,石子合并,删除字符串,乘积最大,释放囚犯)
    乘积最大  由于题目给定的是m,需要分解成m+1部分的乘积,不难想到乘号刚好是m个,那么该题就转化成了m个乘号的插入方式。  最优子结构分析:    设数字字符串为a1a......
  • [2016年NOIP普及组] 回文日期
    [2016年NOIP普及组]回文日期题目大意:用 8 位数字表示一个日期,其中,前 4 位代表年份,接下来 2 位代表月 份,最后 2 位代表日期,一个日期是回文的,当且仅当表示这个日......
  • 459.repeated-substring-pattern 重复的子串
    假设一个字符串,是由一个重复的子串组成的,那么它的最长相等前后缀必然与整个字符串的必然相差了一个重复子串的长度。假设整个字符串的长度为len,那么next[len-1]+1就是......
  • 力扣练习——70 串联所有单词的子串
    1.问题描述给定一个字符串s和一些长度相同的单词words。找出s中恰好可以由words中所有单词串联形成的子串的起始位置。注意子串要与words中的单词完全匹配,中间......
  • 1079 延迟的回文数——20分
    给定一个k+1位的正整数N,写成ak…a1a0的形式,其中对所有i有0<=ai<10且ak>0。N被称为一个回文数,当且仅当对所有i有ai=ak-i。零也被定义为一个回文数。......
  • Java 9.回文数
    给你一个整数x,如果x是一个回文整数,返回true;否则,返回false。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。   例如,121是回文,而123不是。来源:力扣......
  • 回文串
    manacher维护目前右端点最靠右的回文串\([l,r]\),只记录中心\(mid\)和\(r\)即可那么求\(i\)的最长回文半径时如果在\(r\)以左,那么直接可以从回文串的另一半继承......
  • NC23501 小A的回文串
    题目链接题目题目描述小A非常喜欢回文串,当然我们都知道回文串这种情况是非常特殊的。所以小A只想知道给定的一个字符串的最大回文子串是多少,但是小A对这个结果并不是非......
  • NC13230 合并回文子串
    题目链接题目题目描述输入两个字符串A和B,合并成一个串C,属于A和B的字符在C中顺序保持不变。如"abc"和"xyz"可以被组合成"axbycz"或"abxcyz"等。我们定义字符串的价值为......
  • [2016年NOIP普及组] 回文日期
    [2016年NOIP普及组]回文日期分析:根据题意,有一个由年月日组成的八位数,判断是否是回文日期,因为每个月的天数是不一样的,所以可以开一个数组来存每个月的天数,此时有一个特殊......