题目链接:https://acm.creative3605.com/problems/1266
时间限制:
C/C++ 1s
其他语言 2s
空间限制:
C/C++ 32MB
其他语言 64MB
题目描述
小桃进入了一个远古遗迹,远古遗迹上有一行字母代码,字母代码是由 N 个小写字母组成的,小桃认为这个字母代码一定包含了某种古老的信息。经过查询古籍,小桃发现他只需要在这行字母代码中找到一个最长回文子串即可获取隐藏在其中的古老的信息,请你帮他找一下。
输入描述
第一行输入一个由小写字母组成的字符串 S(1<=S.length<=5000)
输出描述
输出最长的回文子串,如果存在多个,请输出最靠前的那一个。
测试样例1
输入
cbcbd
输出
cbc
测试样例2
输入
zccd
输出
cc
解题思路:用中心扩展算法,初始化一个longest读取最长回文子串先为第一个字符,定义一个exp函数读入原来字符串的长度,然后从中间开始往两边跑,如果两边的字符相等并且没有越界那么继续进行循环直到得到不相等的两个字符或者越界了,然后取出不相等的前一个字符,长度为right-left-1的字符串,最后把新字符串对比和之前取出来的对比一下如果比之前的长那么覆盖一下就好了~~~
#include <bits/stdc++.h>
using namespace std;
string exp(string s, int left, int right) {
int n = s.length();
while (left >= 0 && right < n && s[left] == s[right]) {
left--;
right++;
}
return s.substr(left + 1, right - left - 1);
}
string temp(string s) {
int n = s.length();
if (n < 1) return "";
string longest = s.substr(0, 1); // 初始化最长回文子串为第一个字符
for (int i = 0; i < n; i++) {
// 奇数长度的回文串
string odd = exp(s, i, i);
if (odd.length() > longest.length()) {
longest = odd;
}
// 偶数长度的回文串
string even = exp(s, i, i + 1);
if (even.length() > longest.length()) {
longest = even;
}
}
return longest;
}
int main(){
string s;
cin >> s;
cout << temp(s) << endl;
return 0;
}