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;
}
}