1040 Longest Symmetric String (25 分)
Given a string, you are supposed to output the length of the longest symmetric sub-string. For example, given Is PAT&TAP symmetric?, the longest symmetric sub-string is s PAT&TAP s, hence you must output 11.
Input Specification:
Each input file contains one test case which gives a non-empty string of length no more than 1000.
Output Specification:
For each test case, simply print the maximum length in a line.
Sample Input:
Is PAT&TAP symmetric?
Sample Output:
11
本题大意
输入一个字符串,求该字符串中最长对称子串的长度。
分析
Update: 2020/2/6 18:16, 经网友超大拇指提醒,现判断条件更改(原来错误由于substr参数第二个参数理解有误导致)。另外新增解法二。
本题考查字符串处理的知识,掌握string的一些常用函数(e.g. substr,获取字符串子串)解此题不难。解法一采用Brute Force方法。解法二利用动态规划解题,dp[i][j]
表示子串i->j是否是回文,因此动态方程为dp[i][j] = s[i] == s[j] && dp[i + 1][j - 1]
.
解法1:
#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 = 1; j <= s.size() - i; 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;
}}
解法2:
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
string s;
getline(cin, s);
int n = s.size(), res = 1;
vector<vector<bool>> dp(n, vector<bool>(n, false));
for (int i = 0; i < n; ++i) {
dp[i][i] = true;
if (i <= n - 2 && s[i] == s[i + 1]) {
dp[i][i + 1] = true;
res = 2;
}
}
for (int len = 3; len <= n; ++len) {
for (int i = 0; i <= n - len; ++i) {
int j = i + len - 1;
if (s[i] == s[j] && dp[i + 1][j - 1]) {
dp[i][j] = true;
res = len;
}
}
}
printf("%d", res);
return 0;
}