写在前面
- 思路分析
- 分析: dp[i][j]表示s[i]到s[j]所表示的字串是否是回文字串。只有0和1,递推⽅方程为:
- 当s[i] == s[j] : dp[i][j] = dp[i+1][j-1]
- 当s[i] != s[j] : dp[i][j] =0
- 边界: dp[i][i] = 1, dp[i][i+1] = (s[i] == s[i+1]) ? 1 : 0
- 首先初始化dp[i][i] = 1, dp[i][i+1],把长度为1和2的都初始化好,然后从L = 3开始⼀直到 L <= len 根据动
态规划的递归方程来判断
- 分析: dp[i][j]表示s[i]到s[j]所表示的字串是否是回文字串。只有0和1,递推⽅方程为:
- 热点知识,学习ing
- 先易后难学习
测试用例
-
input: Is PAT&TAP symmetric? output: 11
ac代码
- 简单实现(
考试推荐
)#include <iostream> #include <algorithm> using namespace std; int main(){ string s; int maxlen=0; getline(cin,s); for(int i=0;i<s.size();i++){ for(int j=i+1;j<=s.size();j++){ string s1=s.substr(i,j),s2=s1; reverse(s2.begin(),s2.end()); if(s2==s1 && maxlen<s1.size()) maxlen=s1.size(); } } printf("%d",maxlen); return 0; }
- 动规实现
-
#include <iostream> using namespace std; int dp[1010][1010]; int main() { string s; getline(cin, s); int len = s.length(), ans = 1; for(int i = 0; i < len; i++) { dp[i][i] = 1; if(i < len - 1 && s[i] == s[i+1]) { dp[i][i+1] = 1; ans = 2; } } for(int L = 3; L <= len; L++) { for(int i = 0; i + L - 1 < len; i++) { int j = i + L -1; if(s[i] == s[j] && dp[i+1][j-1] == 1) { dp[i][j] = 1; ans = L; } } } printf("%d", ans); return 0; }