Description:
Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信,比如ABBA,ABA,A,123321等,但是他们有时会在开始或结束时加入一些无关的字符以防别国破解。比如进行下列变化ABBA->12ABBA,ABA->ABAKK,123321->51233214 。因为截获的串太长了,而且存在多种可能的情况(abaaab可看作是aba或baaab的加密形式),Cathcer的工作量实在是太大了,他只能向电脑高手求助,你能帮Catcher找出最长的有效密码串吗?Input:
测试数据有若干行字符串,包括字母(字母区分大小写),数字,符号。Output:
与输入相对应每一行输出一个整数,代表最长有效密码串的长度。Sample Input:
ABBA 12ABBA A ABAKK 51233214 abaaab
Sample Output:
4 4 1 3 6 5
这是一道求取字符串中回文串长度的问题。如果仅仅判断是否是回文串,通常有以下两种方法:
1、将字符取反,判断前后两次字符串是否相等;
2、比较首位字符是否相等,若相等则分别向中间缩进一位,再次判断;
上述密码截获问题难点在于如果你想向中间缩进,不知道是头部缩进,还是尾部缩进。因为你并不知道干扰字符是加在首部还是尾部还是两者均有。下面介绍一种很“淳朴”的解决方法,其原理类似于冒泡排序。建立两个索引,头部索引值和尾部值比较,如果不相等,尾部索引减一,再次比较,直至首位相遇,则一次遍历完成。增加头部索引,再次完成上述操作即可。
源程序:
#include<iostream>
#include<string>
using namespace std;
int main() {
string a;
while(cin >> a){
int number = 0;
int max = 0;
for (int i = 0;i < a.size();i++) {
number=0;
for (int start =i , end = a.size() - 1, newend= a.size() - 1;end >= start;) {
if (a[start] == a[end]){//首位比较
if (end > start) {
number= number+2;
}
else number=number+1;
if (number > max)
max=number;
start++;
end--;
}
else {//修改字符串索引长度
newend--;
end = newend;
start = i;
number = 0;
}
}
}
cout <<max<< endl;
}
system("pause");
return 0;
}