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

leetcode5最:长回文子串

时间:2023-06-23 22:11:57浏览次数:26  
标签:子串 leetcode5 string 是否 判断 长度 回文

动态规划:

1个回文串,两边加上同样的字符,也是回文串。这是一个性质,之后要用。

对于一大串字符,从1长度的子串开始判断。

1个长度的子串,肯定回文;如果这个子串两边加上同样的字符,长度变成了3,少了一次判断。

因此还要加上,判断2长度的子串是不是回文。

之后才会判断3长度的子串是不是回文。

以此类推。

 

看图说明,假设有这么一个字符串“abbab" 

列一个二维数据表,这个表存储了所有子串的情况。如下。
a ab abb abba abbab
  b bb bba bbab
    b ba bab
      a ab
        b
  我们就是从第一个对角线开始判断 已知1长度子串肯定回文,又单独判断了2长度的子串是不是回文,对应一个这样的表。(1表示回文,0表示不回文)
1 0      
  1 1    
    1 0  
      1 0
        1

 

那么3长度的子串是不是回文,用一下回文的性质。 3长度,看它首尾是否相等,中间字串是否回文。 4长度,看它首尾是否相等,中间字串是否回文。 首尾字符是否相等这个判断很简单,而它中间的字串是否回文,取决于我们之前算的这个表。 比如0,3位置的子串“abb”是否回文,取决于"a"和“b"以及中间子串b ,而"b"之前已经算过了;只需要额外判断一下"a","b"即可。 转换成动态转移方程 str(begin,end)=str(begin+1)(end-1)&&s[begin]==s[end]; 因此这个表出来了  
1 0 0 1 0
  1 1 0 0
    1 0 1
      1 0
        1

 

代码如下:

class Solution {
public:
    string longestPalindrome(string s) {
if (s.size()<2) return s;

vector<vector<int>> dp(s.size(),vector<int>(s.size(),0));
string ans=s.substr(0,1);
for(int i=0;i<s.size();i++)
{
            dp[i][i]=1;
}
for(int i=0;i<s.size()-1;i++)
{
  if(s[i]==s[i+1])
  { 
    dp[i][i+1]=1;
    ans=s.substr(i,2);
}
}
for(int length=2;length<=s.size();length++)
{
  
    for(int i=0;i<s.size()-length+1;i++)
    {
        if(dp[i+1][i+length-2]==1&&s[i]==s[i+length-1])
        {
            dp[i][i+length-1]=1;
            ans=s.substr(i,length);
        }
    }
    
}


return ans;
    }
};

问题是空间复杂度和时间复杂度都是O(N2

更优的解法之后更新。

 

标签:子串,leetcode5,string,是否,判断,长度,回文
From: https://www.cnblogs.com/HaveFunnyAnyone/p/17500283.html

相关文章

  • #yyds干货盘点# LeetCode程序员面试金典:最短回文串
    1.简述:给定一个字符串s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。 示例1:输入:s="aacecaaa"输出:"aaacecaaa"示例2:输入:s="abcd"输出:"dcbabcd"2.代码实现:classSolution{publicStringshortestPalindrome(Strings)......
  • [Leetcode] 0009. 回文数
    9.回文数点击上方,跳转至Leetcode题目描述给你一个整数x,如果x是一个回文整数,返回true;否则,返回false。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121是回文,而123不是。 示例1:输入:x=121输出:true示例 2:输入:x=-121输出:false解释:......
  • 回文质数(快速求出一个区间内的所有回文数)
    题目链接:回文质数code:#include<bits/stdc++.h>usingnamespacestd;vector<int>constructPalindromes(intstart,intend){vector<int>palindromes;if(start<=1){palindromes.push_back(1);start=2;}intstartLen=......
  • 回文函数
    回文函数,学习到了strlen()函数在获取数组时是从str[1]开始计算的,要想从str[1]开始需要-1;#include<stdio.h>#include<string.h>intmain(){inti,j,n;charstr[80];//存储字符串printf("请输入字符串:\n");gets(str);//从输入读取字符串,并赋值给数组strn=strlen(str);fo......
  • 基本子串结构
    参考xtq2023年论文《一类基础子串数据结构》定义出现次数:对于一个串\(s\),\(\mathrm{occ}(t)\)表示\(t\)在\(s\)中出现次数。扩展串:\(\mathrm{ext(t)}\)表示最长的包含\(t\)的串\(t'\)满足\(\mathrm{occ(t')}=\mathrm{occ(t)}\),分别定义\(\mathrm{Lext(t)}\)......
  • 2023.6.16 构建回文串检测
    注意关键性质,可以重排。所以我们可以只考虑一种情况,其他情况都可以重排到这种情况。考虑在区间内:所有字符都有偶数个,此时不需要改变任何字符,我们可以把字符重排成回文的。只有一种字符有奇数个,其他字符都是偶数个。此时可以拿出这种字符的一个放在最中间。然后又回归到情况1,......
  • 力扣---1177. 构建回文串检测
    给你一个字符串 s,请你对 s 的子串进行检测。每次检测,待检子串都可以表示为 queries[i]=[left,right,k]。我们可以重新排列子串 s[left],...,s[right],并从中选择最多k 项替换成任何小写英文字母。 如果在上述检测过程中,子串可以变成回文形式的字符串,那么检测结......
  • 1177. 构建回文串检测
    给你一个字符串 s,请你对 s 的子串进行检测。每次检测,待检子串都可以表示为 queries[i]=[left,right,k]。我们可以重新排列子串 s[left],...,s[right],并从中选择最多k 项替换成任何小写英文字母。如果在上述检测过程中,子串可以变成回文形式的字符串,那么检测结果......
  • 每日一道leetcode:9. 回文数
    1.题目(简单)题目链接给你一个整数x,如果x是一个回文整数,返回true;否则,返回false。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121是回文,而123不是。示例1:输入:x=121输出:true示例2:输入:x=-121输出:false解释:从左向右读,为-121。从右向左读,为121......
  • 算法题总结-最长回文序列
    原题https://www.nowcoder.com/practice/3cd4621963e8454594f00199f4536bb1?tpId=37&tqId=21255&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3Fdifficulty%3D3%26page%3D1%26pageSize%3D50%26search%3D%26tpId%3D37%26type%3D37&am......