最长回文子串
1.dp 2.双指针
dp
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1010;
bool f[N][N];//f[i][j] 表示i~j是否为回文 1是回文,0不是
int main()
{
memset(f,true,sizeof f);
string s;int ans = 1;
getline(cin,s);
for(int i = s.size() - 1; i >= 0; i --)
for(int j = i + 1; j < s.size(); j ++)
{
f[i][j] = (s[i] == s[j]) && f[i + 1][j - 1];
if(f[i][j]) ans = max(ans,j - i + 1);
}
cout << ans << '\n';
return 0;
}
枚举双指针
#include <iostream>
using namespace std;
int main()
{
string s;
getline(cin,s);
int ans = 1;
for(int i = 0; i < s.size(); i ++)
{
int a = i - 1,b = i + 1;
while(a >= 0 && b < s.size() && s[a] == s[b]) a --,b ++;
a ++,b --;
ans = max(ans,b - a + 1);
a = i,b = i + 1;
while(a >= 0 && b < s.size() && s[a] == s[b]) a --,b ++;
a ++,b --;
ans = max(ans,b - a + 1);
}
cout << ans << '\n';
return 0;
}