Description
题目大意:
有一个环状字符串,从某一点断开,顺时针逆时针字符串一样,则输出YES,否则NO。
注意:
题目只给了从字符之间断开,其实也可以从某个字符断开,以前一直想不通测试样例二abab,样例二即为从字符断开。
想法:
数据比较弱,暴力就可以,但是一开始题意理解错误,样例都过不了,以下附上错误代码(只从字符间断,虽然是题意理解错的,但是按自己理解的也能实现啊)
啊,听了魏同学的讲解发现我的代码只是缺了一种情况,再加一种从字符断的情况就好了,ik指向同一字符开始遍历。
#include<stdio.h>
#include<string.h>
char a[100005];
int main()
{
int i,j,k,n,len,z,t,c;
scanf("%d",&n);
for(c=0;c<n;c++)
{
memset(a,'0',sizeof(a));
scanf("%s",&a);
len=strlen(a);
t=1;
for(i=0;i<len;i++) //遍历一遍从哪个点开始断
{int flag=1;
for(j=i,k=i-1,z=0;z<len;j++,k--,z++) //从断点开始,k倒着走,j正着走
{
if(k==-1) k=k+len; //k倒着走到0,开始从len-1倒着走
if(j==len)j=j-len; //j正着走到len,开始从0正着走
if(a[k]!=a[j]) {flag=0;break;} //有不相同的,结束内循环,表示这个断点不对称
}
if(flag) { //如果此断点都相同,输出yes,循环结束
printf("YES\n");t=0;break;
}
}
if(t==1) printf("NO\n"); //t=0表示已经输出了yes,此时不用 输出no
}
return 0;
}
正确做法:
#include<stdio.h>
#include<string.h>
char a[100005];
int main()
{
int i,j,k,n,len,z,flag,t,c;
scanf("%d",&n);
for(c=0;c<n;c++)
{
memset(a,'0',sizeof(a));
scanf("%s",&a);
len=strlen(a);
flag=0;
for(i=0;i<len;i++)
{
for(j=i,k=0;k<len;j--,k++)
{
if(j==-1) j=len-1;
if(a[j]!=a[k]) break;
}
if(k==len) {flag=1;break;}
}
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}
思路:
-
输入字符串s,使字符串z为两倍的s,反转字符串d,判断s是否为d的字串;
难点:
-
让字符串变成环(解决办法:让d=两倍的s)
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
string s,z;
scanf("%d",&n);
while(n--)
{
cin>>s;
z=s+s; //复制两倍
reverse(z.begin(),z.end()); //反转
printf("%s\n",strstr(z.c_str(),s.c_str())?"YES":"NO");
}