每天一道算法题(29)——检测字符串的是否由移位得到 题目:  思路: 代码:

每天一道算法题(29)——检测字符串的是否由移位得到
题目: 
思路:
代码:

       字符串ABCD,可以由字符串BCDA或者CDAB通过循环移位而得到。请编程实现以下检测:字符串S1是否可以由字符串S2通 过循环移位而得到。


思路:

      1.不涉及字符串拷贝,只通过指针移位匹配字符串。

      2.遍历s1的所有移位形式,只要有一种形式匹配s2则退出。


代码:

#include"iostream"
using namespace std;

bool cmp(const char* p1,const char *p2,int len){//依据特定长度,匹配两段字符串
	if((!p1&&!p2)||(len==0))//注意长度为“0的时候匹配成功”
		return true;
	if(!p1||!p2||len<0)
		return false;

	int i=0;
	while(i<len&&*(p1+i)==*(p2+i))
		i++;
	if(i==len)
		return true;
	else 
		return false;
}  
bool decision(const char* p1,const char* p2){//判决函数
	if(!p1&&!p2)
		return true;

	if(!p1||!p2)
		return false;

	if(strlen(p1)!=strlen(p2))
		return false;
	int k=strlen(p1);
	for(int i=0;i<k;i++){
		if(cmp(p1+i,p2,k-i)&&cmp(p1,p2+k-i,i))
		   return true;
	}
	return false;
}

int _tmain(int argc, _TCHAR* argv[])
{
	char p1[]="ABCD";
	char p2[]="BCDA";

	if(decision(p1,p2))
		cout<<"true"<<endl;
	else
		cout<<"False"<<endl;
}