最优代码写的非常简洁,非常好,用了一个字符串比较函数strcmp,你写的非常复杂,你的解法不能包含每种情况,所有很多细节和特殊情况需要注意,就会把程序复杂化。。。和最优代码显然不是一个水平上的。。。还是好好看看吧
介绍:strcmp函数
C/C++函数,比较两个字符串
设这两个字符串为str1,str2,
若str1==str2,则返回零;
若str1<str2,则返回负数;
若str1>str2,则返回正数。
matlab中函数,strcmp(s1,s2) 判断两个字符串s1和s2是否相同,相同返回true ,不同返回false
国王的魔镜
- 描述
-
国王有一个魔镜,可以把任何接触镜面的东西变成原来的两倍——只是,因为是镜子嘛,增加的那部分是反的。
比如一条项链,我们用AB来表示,不同的字母表示不同颜色的珍珠。如果把B端接触镜面的话,魔镜会把这条项链变为ABBA。如果再用一端接触的话,则会变成ABBAABBA(假定国王只用项链的某一端接触魔镜)。
给定最终的项链,请编写程序输出国王没使用魔镜之前,最初的项链可能的最小长度。
- 输入
-
第一行是一个整数N(N<=10)表示测试数据的组数)
每组测试数据占一行 只有一个字符串(长度小于100),由大写英文字母组成,表示最终的项链。 - 输出
- 每组测试数据的输出只有一个整数,表示国王没使用魔镜前,最初的项链可能的最小长度。
- 样例输入
-
2 ABBAABBA A
- 样例输出
-
2 1
最优代码(自己理解):
#include<stdio.h> #include<string.h> main() { int z,x,q,i; char a[101],t[51]; scanf("%d",&z); getchar(); while(z--) { gets(a); do { x=strlen(a); if(x%2) break; for(i=0;i<x/2;i++) t[i]=a[x-1-i]; t[i]='\0'; a[x/2]='\0'; q=strcmp(a,t); }while(q==0); printf("%d\n",x); } }
你的思想(看不看都行。。。):如果一开始长度为奇数,则肯定没有经过魔镜反射,直接输出即可,这个就是最初长度
如果一开始不是奇数,则把这个项链不停地从中间断开,每断一次比较两边是否对称相等,相等则继续断,知道找到两边不相等的这个情况,乘上2即为初始长度。可是有很多特殊情况不能被其包括,如ABCCBA,初始没有经过反射的长度显然是ABC,可如果按照上述思想,第一次断是ABC | CBA,两边对称,程序还会继续断,可ABC是奇数怎么继续断?所以如果断到两边是奇数且两边相等就直接输出一半的长度即可;还有一种特殊情况AA ,AAAA,AAAAAA这个也按照上面来即可,不停的断,知道两边都是奇数且两边相等,输出1即可(AAA是没有经过反射的情况输出3)
你的代码:
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; int main() { int n,i,d,t,m; char a[200]; scanf("%d",&n); getchar(); while(n--) { m=1; scanf("%s",a); t=strlen(a); if(t&1) printf("%d\n",t); else for(i=t/2;i>0;i=i/2) { for(d=0;d<i;d++) if(a[i-1-d]!=a[i+d]) { m=0; break; } if(m==0) { printf("%d\n",2*i); break; } if(m==1&&i%2!=0) {printf("%d\n",i); break;} } } return 0; }
如果用你的方法还有个地方需要注意,对称比较是a[i-d]和a[i+1+d]这样比较,d是距离,要注意的点就是+1
即要区分开3 2 1 a 1 2 3
3 2 1 a b 1 2 3