密码截获问题

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;
}




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值