51nod 1347 旋转字符串

本文探讨了如何判断一个字符串是否可以通过旋转变为一个对串。通过对串的特性进行分析,提出了两种解决方案:一种是直接检查字符串是否为对串;另一种是通过模拟旋转过程来验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

S[0...n-1]是一个长度为n的字符串,定义旋转函数Left(S)=S[1…n-1]+S[0].比如S=”abcd”,Left(S)=”bcda”.一个串是对串当且仅当这个串长度为偶数,前半段和后半段一样。比如”abcabc”是对串,”aabbcc”则不是。

现在问题是给定一个字符串,判断他是否可以由一个对串旋转任意次得到。

Input
第1行:给出一个字符串(字符串非空串,只包含小写字母,长度不超过1000000)
Output
对于每个测试用例,输出结果占一行,如果能,输出YES,否则输出NO。
Input示例
aa
ab
Output示例

YES
NO
思路:开始没发现,原来一个对串不论怎么旋转还是对串,一个不是对串的字符串怎么旋转都不会变成对串,所以只要看给的字符串是不是对串就行了

#include<iostream>
#include<cstring>
using namespace std;
char s[1000000];
int main()
{
	while(cin>>s)
	{
		int len=strlen(s);
		if(len%2==1)     //奇数长度的字符串不是对串
		{
			printf("NO\n");
			return 0;
		}
		int flag=1;
		for(int i=0;i<len/2;i++)
		{
			if(s[i]!=s[i+len/2])
			{
				flag=0;	
				break;
			}	
		}
		if(flag)
		cout<<"YES"<<endl;
		else
		cout<<"NO"<<endl;
	}
	return 0;
}
开始想的是模拟“循环”,看看能不能变成对串,这里也贴下代码吧(也AC掉了)

#include<iostream>
#include<cstring>
using namespace std;
char s[1000000];
int main()
{
	while(cin>>s)
	{
		int len=strlen(s);
		int i,j,k,flag;
		for(k=0;k<len;k++)
		{
			flag=0;
			int i=k,j=k+len/2;
			if(j>=len)
			j=j%len;
			while(s[i]==s[j])
			{
				i++;
				j++;
				if(j>=len)
				j=j%10;
				if(j==k)
				{
					flag=1;
					break;
				}
			}
			if(flag)
			break;	
		}
		if(flag)
		cout<<"YES"<<endl;
		else
		cout<<"NO"<<endl;
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值