描述
Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信,比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解。比如进行下列变化 ABBA->12ABBA,ABA->ABAKK,123321->51233214 。因为截获的串太长了,而且存在多种可能的情况(abaaab可看作是aba,或baaab的加密形式),Cathcer的工作量实在是太大了,他只能向电脑高手求助,你能帮Catcher找出最长的有效密码串吗?
数据范围:字符串长度满足 1≤n≤2500
输入描述:
输入一个字符串(字符串的长度不超过2500)
输出描述:
返回有效密码串的最大长度
示例1
输入:
ABBA
输出:
4
示例2
输入:
ABBBA
输出:
5
示例3
输入:
12HHHHA
输出:
4
代码
1)方法1:中间扩散
#include<cstdio>
#include<string>
using namespace std;
/*
就是求最长回文串
*/
int main()
{
char buf[3000];
fgets(buf, 3000, stdin);//读取字符串
string str = buf;//转换为C++风格字符串
str.pop_back();//去掉fgets多读的换行符
int l, r;//左右指针
int max_len = 0;//最大长度
int max_pos = 0;//最长子串的起点位置
string temp = "";
for (int i = 0; i < str.size(); i++)
{
l = i - 1;//i左侧
r = i + 1;//i右侧
int len = 1;
// 向左
while (l >= 0 && str[l]==str[i])
{
len++;
l--;
}
// 向右
while (r < str.size() && str[r] == str[i])
{
len++;
r++;
}
// 同时左右
while (l >= 0 && r < str.size() && str[l] == str[r])
{
len += 2;
l--;
r++;
}
if (len > max_len)
{
max_len = len;
max_pos = l;
}
}
// 截取字符串输出
//printf("%s", str.substr(max_pos + 1, max_len).c_str());
// 输出最长回文串长度
printf("%d",max_len);
}