您的位置:首页 > 其它

A1040 Longest Symmetric String(最大回文子串)

2019-08-19 17:31 148 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_44761480/article/details/99741852
  1. 如果数组过大(如1000*1000),一定要定义在函数外面。
  2. fgets(),读入的最后一个元素是’\n’
char s[MaxN];
fgets(s,MaxN,stdin);
#include <iostream>
#include <string>
#include <set>
#include <map>
#include<queue>
#include<stack>
#include<algorithm>
#include<stdio.h>

//new and delete
//A1040 Longest Symmetric String
using namespace std;

const int MaxN = 1001;
const int Inf = 0x3fffffff;

void PrintM(int a[][MaxN], int N) {
cout <<"数组:"<< endl;
for (int i = 0; i < N; i++) {

for (int j = 0; j < N; j++)
cout << a[i][j] << " ";
cout << endl;
}
cout << endl;
}
//dp方法找最长回文子串
int dp[MaxN][MaxN] = { 0 };
//Longest Symmetric String, return its length
int LSS(char s[]) {
int N;	//字符串长度
int i = 0;
while (s[i] != '\n')	//fgets()把'\n'也读进去了
i++;
N = i;

//边界
for (int i = 0; i < N; i++) {
dp[i][i] = 1;
if (s[i] == s[i+1])
dp[i][i + 1] = 1;
}
//PrintM(dp, N);
//长度>=2
for (int L = 2; L < N; L++) {
for (int i = 0; i < N-L; i++) {
if (s[i] == s[i + L])
dp[i][i + L] = dp[i + 1][i + L - 1];
else
dp[i][i + L] = 0;
}
}
//PrintM(dp, N);

int MAX = 1;
for (int i = 0; i < N; i++)
for (int j = i; j < N; j++) {
if(dp[i][j]!=0)
MAX = max(MAX, j-i+1);
}
return MAX;

}

int main() {
char s[MaxN];
fgets(s,MaxN,stdin);
//scanf("%s", &s);
LSS(s);
int ans=LSS(s);

printf("%d\n", ans);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: