求一个字符串中最长回文子串的长度(承接上一个题目)
2011-12-21 12:08
369 查看
问题描述:如题,给定一个字符串str和其长度n,求该字符串的一个最长公共回文子串的长度(公共子串个公共子序列是两个不同的概念)。并打印出该回文子串。
解答:1,首先给出一个比较直观的解法。根据回文的性质,我们可以把str进行逆转得到str1,然后求str和str1的最长公共子串,那么该子串的长度就是str的最长回文子串的长度,该公共子串就是最长的那个回文子串。也即我们把这个题目转化为求两个字符串str和str1的最长公共子串的问题。我们假设C[i,j]为以str[i]和str1[j]结尾的最长公共子串的长度,那么状态转移方程为:
解答:1,首先给出一个比较直观的解法。根据回文的性质,我们可以把str进行逆转得到str1,然后求str和str1的最长公共子串,那么该子串的长度就是str的最长回文子串的长度,该公共子串就是最长的那个回文子串。也即我们把这个题目转化为求两个字符串str和str1的最长公共子串的问题。我们假设C[i,j]为以str[i]和str1[j]结尾的最长公共子串的长度,那么状态转移方程为:
C[i,j]=0 if(str[i]!=str1[j])C[i,j]=c[i-1,j-1]+1 if(str[i]==str1[j])
初始条件为C[0,0]=0;最初的时间代价为O(n^2),空间代价为O(n^2),空间代价还可以优化为O(n),只需要j的循环式从高往低即可。代码如下://求str1和str2的最长公共子串,下标从1算起void LCS_continue(char *str1,int n1,char *str2,int n2){ int **C=new int*[n1+1]; for(int i=0;i<=n1;i++){ C[i]=new int[n2+1](); } int max=0; int max_index_i=0; int max_index_j=0; for(int i=1;i<=n1;i++){ for(int j=1;j<=n2;j++){ if(str1[i]==str2[j]) C[i][j]=C[i-1][j-1]+1; else C[i][j]=0; if(C[i][j]>max){ max=C[i][j]; max_index_i=i; max_index_j=j; } } } cout<<"最长公共子串长度为:"<<max<<ends; if(max>0){ cout<<"子串为:"<<ends; while(str1[max_index_i]==str2[max_index_j--]){ cout<<str1[max_index_i--]<<ends; } } //free mem for(int i=0;i<=n1;i++){ delete [] C[i]; } delete [] C;}空间优化:void LCS_continue_OPM(char *str1,int n1,char *str2,int n2){ int *C=new int[n2+1](); int max=0; int max_index_j=0; for(int i=1;i<=n1;i++){ for(int j=n2;j>0;j--){ if(str1[i]==str2[j]) C[j]=C[j-1]+1; else C[j]=0; if(C[j]>max){ max=C[j]; max_index_j=j; } } } cout<<"最长公共子串长度为:"<<max<<ends; if(max>0){ cout<<"子串为:"<<ends; while(max>0){ cout<<str2[max_index_j--]<<ends; max--; } } //free mem delete [] C;}2,下面给出一个直观的动规解,
相关文章推荐
- 对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。
- 对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。
- 回文串是指这个字符串无论从左读还是从右读,所读的顺序是一样的;简而言之,回文串是左右对称的。现在,对于一个给定的母串 abcdedcb求最长回文子串的长度
- 给定一个字符串,求它的最长回文子串的长度,并打印出最长回文子串
- 给定一个字符串s,找出s中最长的回文子串,你可以假设s的最大长度是1000。
- C语言 求一个字符串中最长回文子串的长度
- 题目描述 给定一个字符串,找出该字符串的最长回文子串。回文字符串指的就是从左右两边看都一样的字符串,如aba,cddc都是回文字符串。字符串abbacdc存在的回文子串有abba和cdc,因此它的最长
- JAVA代码—算法基础:给定一个字符串查找最长回文子串
- 找出一个字符串中最长的连续数字子串,输出该字符串及长度
- 求一个字符串的最长不重复子串的最大长度
- Longest Palindromic Substring 在一个字符串里找最长回文子串@LeetCode
- 求一个字符串中,最长回文子串
- 一个字符串A的子串被定义成从A中顺次选出若干个字符构成的串。如A=“cdaad" ,顺次选1,3,5个字符就构成子串" cad" ,现给定两个字符串,求它们的最长共公子串。 小王对既是素数又是回文的
- 给定一个字符串,求出最长的连续配对括号子串的长度
- 面试题:最长回文子串(即求对称字符串的最大长度 )
- 给定一个字符串,找到最长的子串的长度没有重复字符
- 409. Longest Palindrome (计算可由一个字符串中数字字符构成的最长回文数的长度)
- 输入一个字符串A,求其中最长的连续递增子串的长度。例如 "hidefef" 中最长的连续递增子串是 "def" ,长度为 3
- JAVA:返回字符串中最长回文子串的长度
- 求字符串中的最长回文子串的长度