您的位置:首页 > 编程语言 > C语言/C++

PAT-A-1040 Longest Symmetric String (25 分) 动态规划求最长对称字串 C++题解

2019-08-20 14:50 477 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/jal517486222/article/details/99840793

1040 Longest Symmetric String (25 分)

题目传送门:1040 Longest Symmetric String (25 分)

一、题目大意

求字符串的最大对称子串的长度

二、解题思路

这道题可以用动态规划来处理,转移方程为:
dp[i]=dp[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]
dp[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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: