(最长回文子串 线性DP)51nod 1088 最长回文子串

mac2022-06-30  102

输入一个字符串Str,输出Str里最长回文子串的长度。

回文串:指aba、abba、cccbccc、aaaa这种左右对称的字符串。

串的子串:一个串的子串指此(字符)串中连续的一部分字符构成的子(字符)串例如 abc 这个串的子串:空串、a、b、c、ab、ac、bc、abc

 收起  

输入

输入Str(Str的长度 <= 1000)

输出

输出最长回文子串的长度L。

输入样例

daabaac

输出样例

5----------------------------------------------------------------------------------------------------------可以用dp[i][j]来表示S[i]到S[j]所表示的子串是否是回文子串,此处要分两种情况讨论:1)如果S[i] == S[j],那么如果dp[i+1][j-1]是1,那就是回文子串,令dp[i][j]为1(dp[i][j]为1表示为回文子串,否则为0为不是回文子串)。2)如果S[i] != S[j],那么令dp[i][j]=0,因为一定不是回文子串。另外,面对边界的问题,dp[i][i]一定是回文子串,毕竟单个字母一定是回文的。dp[i][i+1]中,如果S[i] == S[i+1],就是回文子串,否则不为回文子串,此处判断两个字母是否构成回文子串。C++代码: #include<iostream> #include<stdio.h> #include<string.h> using namespace std; const int maxn = 1002; char str[maxn]; int dp[maxn][maxn]; int main() { cin >> str; int len = strlen(str); int ans = 1; for (int i = 0; i < len; i++) { dp[i][i] = 1; if (str[i] == str[i + 1]) { dp[i][i + 1] = 1; ans = 2; } else { dp[i][i + 1] = 0; } } int j; for (int L = 3; L < len; L++) { for (int i = 0; i + L - 1 < len; i++) { j = i + L - 1; if (str[i] == str[j] && dp[i + 1][j - 1]) { dp[i][j] = 1; ans = L; } } } cout << ans << endl; system("pause"); return 0; }

 

转载于:https://www.cnblogs.com/Weixu-Liu/p/10712024.html

相关资源:JAVA上百实例源码以及开源项目
最新回复(0)