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

最长回文子串

时间:2023-09-14 10:32:17浏览次数:35  
标签:子串 val res 字符串 回文 最长 size

给你一个字符串 s,找到 s 中最长的回文子串。

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

 

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例 2:

输入:s = "cbbd"
输出:"bb"

 

class Solution {
public:
   string longestPalindrome(string s) {
       if(s.size()==1)
           return s;

       // 初始化dp为1
       vector<vector<int>> res(s.size(),vector<int>(s.size(),1));

       // 长度为1的最长回文子串一定为1
       // 长度为2的最长回文子串
       for(int i=0;i<s.size()-1;i++){
           int j=i+1;
           if(s[i]==s[j])
               res[i][j]=2;
       }

       // 长度为3及以上的最长回文子串
       for(int len=3;len<=s.size();len++){
           // i表示回文串的左侧
           for(int i=0;i<=s.size()-len;i++){
               // j表回文串的右侧,通过i和len计算得到右侧
               int j=len+i-1;

               if(s[i]==s[j])
                   res[i][j]=res[i+1][j-1]+2;
               else
                   res[i][j]=max(res[i+1][j],res[i][j-1]);
           }
       }

       // 搜索数组最大的数据,并记录i,j
       int col=0;
       int max_val=0;
       for(int i=0;i<s.size();i++){
           for(int j=i;j<s.size();j++){
               if(res[i][j]>max_val && j-i+1==res[i][j] ){
                   max_val=res[i][j];
                   col=i;
               }
           }
       }
       return s.substr(col,max_val);
   }
};

标签:子串,val,res,字符串,回文,最长,size
From: https://blog.51cto.com/u_15862486/7468053

相关文章

  • AcWing 895. 最长上升子序列
    题目给定一个长度为$N$的数列,求数值严格单调递增的子序列的长度最长是多少。输入格式第一行包含整数$N$。第二行包含$N$个整数,表示完整序列。输出格式输出一个整数,表示最大长度。数据范围$1≤N≤1000,−10^9≤数列中的数≤10^9$输入样例:73121856输出样例:4......
  • 用栈来判断回文数
    代码如下所示:/***用栈实现回文数**/publicclassTest2{publicstaticvoidmain(String[]args){//测试代码System.out.println(isPalindromic("1221"));//输出true}//判断字符串是否回文,如果是数字的话可以转换为字符串再进行回文......
  • 最长上升子序列----nlogn算法-模板
    #include<iostream>#include<vector>#defineMAX1010usingnamespacestd;vector<int>len;//这里我返回的满足len[k]>=val[i]且k最小的位置//和上文红色部分的描述是等价的,只是变成了更新len[k],而不是len[k+1]intbisearch(intval){intleft=0,right=len.size(......
  • 最长上升子序列 ---模板
    #include<stdio.h>#include<string.h>intn;intp[100000];intdp[100000];intmain(){ inti,j,k; while(scanf("%d",&n)!=EOF){ for(i=1;i<=n;i++) scanf("%d",&p[i]); memset(dp,0,sizeof(dp)); dp[1]=1; ......
  • 查找字符串最长公共子串,请编码实现一个命令行工具,找出指定的2个字符串的最长公共子串
    要求给定两个字符串str1和str2,输出两个字符串的最长公共子串,如果最长公共子串为空,输出-1。输入描述命令行工具接收两个字符串参数。输入字符串的合法字符集为[a-zA-Z0-9],大小写敏感,无需考虑异常输入场景。输出描述输出一行最长公共子串示例输入1ABCD2345G12345EF输出2345解法一:滑......
  • hash判断回文串
    hash的计算方法参考《字符串哈希》建立正反两向的字符串哈希数组for(inti=1;i<=n;i++){p[i]=p[i-1]*P;h[i]=h[i-1]*P+str[i];//}for(inti=n;i>=1;i--){L[i]=L[i+1]*P+str[i];//}如果某一段字符串正向的hash值......
  • 单词搜索 II(字典树、数组)、合并两个有序数组(数组、双指针)、验证回文串(双指针、字
    单词搜索II(字典树、数组)给定一个mxn二维字符网格board****和一个单词(字符串)列表words,找出所有同时在二维网格和字典中出现的单词。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一......
  • 剑指Offer 48. 最长不含重复字符的子字符串
    题目链接:剑指Offer48.最长不含重复字符的子字符串题目描述:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。解法思路:代码:funclengthOfLongestSubstring(sstring)int{varresintifs==""{returnres}//......
  • 算法刷题:一步步优化系列01.最长连续序列
    题目链接:最长连续序列目录暴力解法(超时)优化内层查找(On->O1但超时)问题:重复的边界会重新迭代优化重复迭代:在值域而非定义域迭代,去重(超时)问题:值域大且元素离散度大时,会大量迭代到不存在的元素,空迭代优化空迭代:HashSet去重,每次迭代的元素都存在(26ms)从左边界重......
  • 128. 最长连续序列
    给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为 O(n) 的算法解决此问题。示例1:输入:nums=[100,4,200,1,3,2]输出:4解释:最长数字连续序列是[1,2,3,4]。它的长度为4。示例2:输入:nums=[0,......