题目来源:华为机试题(密码截取)
密码截取
描述:
Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信,比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解。比如进行下列变化 ABBA->12ABBA,ABA->ABAKK,123321->51233214 。因为截获的串太长了,而且存在多种可能的情况(abaaab可看作是aba,或baaab的加密形式),Cathcer的工作量实在是太大了,他只能向电脑高手求助,你能帮Catcher找出最长的有效密码串吗?
运行时间限制: 无限制
内存限制: 无限制
输入:
字符串-密码内容
输出:
整形数-有效密码串最大长度
样例输入:
ABBA
样例输出:
4
我的答案(C++):
目前仍有测试样例未通过,求高手分析
#include<iostream>
#include<string>
using namespace std;
int main()
{
string code;
cin>>code;
int len = code.size();
char* cur,* pre,* post;
int maxLen = 0; // 保存最大回文子串的长度
int tempLen =0 ; // 临时保存当前回文子串的长度,用于和maxLen比较
for(int i=0;i<len;i++)
{
cur = &code[i];
/*
以cur为中心,pre和post分别向前和向后扫描
可以找到形如 ABA 的回文
*/
pre = post = cur;
while(pre!=NULL && post!=NULL && *pre==*post)
{
--pre;
++post;
}
// 计算当前以cur为中心的回文长度,并和保存的最大回文长度比较
maxLen = maxLen >(tempLen=post - pre - 1 )? maxLen : tempLen;
/*
以cur和cur+1为中心,pre和post分别向前和向后扫描
可以找到形如 ABBA 的回文
*/
if(*cur == *(cur+1))
{
pre = cur;
post = cur+1;
while(pre!=NULL && post!=NULL && *pre==*post)
{
--pre;
++post;
}
// 计算当前以cur为中心的回文长度,并和保存的最大回文长度比较
maxLen = maxLen >(tempLen=post - pre - 1 )? maxLen : tempLen;
}
}
cout<<maxLen<<endl;
return 0;
}