天梯赛 L2-031 深入虎穴 (25 分)
题目
对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11。
输入格式
输入在一行中给出长度不超过1000的非空字符串。
输出格式:
在一行中输出最长对称子串的长度。
测试样例
输入样例1:
Is PAT&TAP symmetric?
输出样例1:
11
简单分析:
- 可以使用双指针算法,找到对半分的中心轴,然后往左右两边移动指针
- 当然也可以使用DP,就是一个类似LIS+贪心的问题
- 但是考虑到是基础题,自己也不太会DP~能用简单的算法就用简单的
代码
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main() {
string str;
getline(cin, str);
int res = -1;
for (int i = 0; i < str.size(); i++)
for (int j = str.size() - 1; j >= i; j--) {
int l = i, r = j;
while (l <= r && str[l++] == str[r--])
if (l > r)
res = max(res, j - i + 1);
}
cout << res << endl;
return 0;
}
双指针算法
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
string str;
int main() {
getline(cin, str);
int res = 0;
for (int i = 0; i < str.size(); i++) {
int l = i, r = i;
while (str[r + 1] == str[i]) r++;
while (l && r + 1 < str.size() && str[l - 1] == str[r + 1])
l--, r++;
res = max(res, r - l + 1);
}
cout << res << endl;
return 0;
}
总结反思
- 佛主保佑,永无BUG,一发AC~
- 这种双指针设计的题,也能出在L2里面,感觉有点难啊
- 菜就多练
本文介绍了天梯赛 L2-008 的解题思路,该题目要求找出给定字符串中最长的对称子串。通过分析,提出了使用双指针算法来解决此问题,并给出了暴力枚举和双指针算法的代码示例,最终分享了对题目的反思和解题经验。
891

被折叠的 条评论
为什么被折叠?



