题目描述
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;
}