题目

思路
最朴实无华的就是两个嵌套循环遍历所有的子串,然后再一个循环判定是否为回文,On³的复杂度
然而判定回文的时候,可以从子串出发:
若这个串去掉头尾的时候不是回文串,那么这个串一定不是回文串。
那么我们只需要从回文串增加头尾再判定即可(只判定头尾是否相等
所以有两种,一种是偶数串,一种奇数串,分别判定一遍即可
代码
#include<iostream>
#include<string.h>
using namespace std;
int palindrome(string s)
{
int l = s.length();
int max = 1;
bool* arr = new bool[l * l];
memset(arr, false, sizeof(bool) * l * l);
for(int i = 0; i < l; i++)
{
arr[i * l + i] = 1;
int left = i - 1;
int right = i + 1;
while(left >= 0 && right < l)
{
if(s[left] != s[right])
{
break;
}
else
{
arr[left * l + right] = true;
if(right - left + 1 > max)
max = right - left + 1;
}
left--;right++;
}
}
for(int i = 0; i < l - 1; i++)
{
int left = i;
int right = i + 1;
while(left >= 0 && right < l)
{
if(s[left] != s[right])
{
break;
}
else
{
arr[left * l + right] = true;
if(right - left + 1 > max)
max = right - left + 1;
}
left--;right++;
}
}
// for(int i = 0; i < l; i++)
// {
// for(int j = 0; j < l; j++)
// cout << static_cast<int>(arr[i*l + j]) << " " ;
// cout << endl;
// }
delete[] arr;
return max;
}
int main()
{
int t;
cin >> t;
for(int i = 0; i < t; i++)
{
cout << "case #" << i << ":"<<endl;
string s;
cin >> s;
cout << palindrome(s) << endl;
}
return 0;
}
思路②
可以参考一下1039的题目
把题目给的子串看为A, B = A.reverse
然后完全按1039思路完成
本文介绍了一种优化方法来寻找字符串中的最长回文子串,通过避免全排列检查,降低时间复杂度。思路包括两种:一是通过两个循环分别处理偶数长度和奇数长度的回文串;二是结合1039题目的思路,利用字符串反转特性。代码实现中,使用了动态规划存储子串是否为回文的信息,并更新最大回文子串长度。
454

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



