C实现 题目 1209: 密码截获

题目描述

Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码 进行通信,比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解。比如进行下列变化 ABBA->12ABBA,ABA->ABAKK,123321->51233214 。因为截获的串太长了,而且存在多种可能的情况 (abaaab可看作是aba,或baaab的加密形式),Cathcer的工作量实在是太大了,他只能向电脑高手求助,你能帮Catcher找出最长的 有效密码串吗?

输入格式

测试数据有若干行字符串,包括字母,数字,符号。(字母区分大小写)

输出格式

与输入相对应每一行输出一个整数,代表最长有效密码串的长度。

样例输入

复制
<span style="color:#333333"><span style="color:#333333">ABBA
12ABBA
A
ABAKK
51233214
abaaab</span></span>

样例输出

复制
<span style="color:#333333"><span style="color:#333333">4
4
1
3
6
5</span></span>
#include <stdio.h>
#include <string.h>
int compare(char s1[],char s2[]);//比较翻转后的子串与子串是否完全一样 
char * reverse(char a[]);//翻转子串 
char s1[1000];//要测试输入的字符数组 
char s2[1000];//获取子串的数组 
char s3[1000];//保存翻转后的子串(这里为什么要声明一个全局字符数组s3?因为翻转函数返回的是地址,而在翻转函数中声明的字符数组生存期只在函数作用域内,出了函数这个字符数组就销毁了,返回的地址也就意义不明了) 
char *s;//声明一个全局指针指向翻转后的子串。 
int main(){
	int cnt;//每次比较时统计有多少个字符相等 
	int max;//比较完全后的最大值 
	int z;//z是辅助获取子串的变量 
	int t;//t是每次获取子串时的下标索引 
	while(gets(s1)!=NULL){
		z=strlen(s1)-1; 
		cnt=0;
		max=cnt;					 
			for(int i=0;i<strlen(s1);i++){//可以理解为一个正三角子串,如 1234       4
									 //i是每行最大子串的长度,也是每行子串的个数	3 34
									 //								 				2 23 234
									 //                              				1 12 123 1234	 
			for(int j=0;j<=i;j++){
				t=0;
				for(int k=0;k<=j;k++){
					s2[t++]=s1[k+z];//这里z就是辅助获取子串 
				}
				s2[t]='\0';//别忘了添加结束符使之成为一个字符串 
				s=reverse(s2);//翻转 
				cnt=compare(s,s2);//获取比较后的值 
				if(max<cnt)
				max=cnt;
			}
			z--;
		}
		printf("%d\n",max);
	}
}
char* reverse(char a[]){
	int i=0;
	for(int j=strlen(a)-1;j>=0;i++,j--)
	{
		s3[i]=a[j];
	}
	s3[i]='\0';
	return s3;
}
int compare(char s1[],char s2[]){
	int cnt=0;
	for(int i=0;i<strlen(s1);i++){
		if(s1[i]==s2[i])
		cnt++;
		else//遇见一个不匹配的直接结束函数 
		return 0;
	}
	return cnt;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值