PAT-A-1040 Longest Symmetric String (25 分) 动态规划求最长对称字串 C++题解
1040 Longest Symmetric String (25 分)
题目传送门:1040 Longest Symmetric String (25 分)
一、题目大意
求字符串的最大对称子串的长度
二、解题思路
这道题可以用动态规划来处理,转移方程为:
d p [ i ] = d p [ i − 1 ] + 2 , 当 s [ i ] = = s [ i − 1 ] dp[i] = dp[i-1] + 2, 当s[i] == s[i-1] dp[i]=dp[i−1]+2,当s[i]==s[i−1]
d p [ i ] = 1 , 当 s [ i ] ! = s [ i − 1 ] dp[i] =1, 当s[i] != s[i-1] dp[i]=1,当s[i]!=s[i−1]
dp[i]是表示以i结尾的回文字串的长度。如果i-dp[i-1]-1位置的字符与i位置的字符相同,则表示以i-1结尾的回文串可以左右各扩大一位。但是,此处有一个坑,就是当出现连续相同的字串时,此转移方程会有问题,比如说,虽然此时s[i-dp[i-1]-1]可能不等于s[i],但此时dpi[i]未必等于1,如果dp[i]可以等于最长的连续与s[i]相同的字串的长度。我们可以用数组same记录i处连续相同的s[i]的长度。
赠送样例:
- input:
123
1223
12223
122223
1222223
12221
1222
1
12
11211
121
11
- output:
1
2
3
4
5
5
3
1
1
5
3
2
三、AC代码
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
while(getline(cin, s))
{
vector<int>dp(s.size(), 1), same(s.size(), 1);
for(int i = 1; i < s.size(); i++){
if(s[i] == s[i-1]){
same[i] = same[i-1] + 1;
}
int j = i - dp[i-1] - 1;
if(j >= 0 and s[j] == s[i]){
dp[i] = dp[i-1] + 2;
}else{
dp[i] = same[i]; // 关键部分
}
}
cout << *max_element(dp.begin(), dp.end()) << endl;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
文章来源: blog.csdn.net,作者:爱玲姐姐,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/jal517486222/article/details/99840793
- 点赞
- 收藏
- 关注作者
评论(0)