最优代码写的非常简洁,非常好,用了一个字符串比较函数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