[编程之美] PSet3.1 字符串移位包含的问题

问题描述:

给定两个字符串s1和s2,要求判定s2是否弄够被s1做循环移位(rotate)得到的字符串包含。例如,给定s1=AABCD和s2=CDAA,返回true;给定s1=ABCD和s2=ACBD,返回false.


思路分析:

解法一:直接循环移位

      代码如下:

//解法一:通过对src循环移位判断是否dst在src内
bool findStr(char src[],char dst[],int srcLen , int dstLen)
{
	int K = srcLen;
	while(K--){//循环右移dstLen次恢复原位
		char tempChar = src[srcLen-1];
		for(int i=srcLen-1 ; i>=1 ; i--)//移位一次
			src[i] = src[i-1];
		src[0] = tempChar;
		if(strstr(src,dst))
			return true;
	}
	return false;
}

解法二:直接分析移位结果,发现ABCD移位后的结果一定是ABCDABCD的子串,通过提高空间复杂度来换取时间复杂度的降低。代码如下:

//解法二:通过在组合字符串[src,src]上寻找dst进行判定
bool findStr(char src[],char dst[], int srcLen)
{
	bool flag = false;
	char *srcsrc = new char[2*srcLen+1];//多存放一个'\0'
	strcpy_s(srcsrc, sizeof(char)*(2*srcLen+1) , src);
	strcat_s(srcsrc, sizeof(char)*(2*srcLen+1) , src);
	if(strstr(srcsrc,dst))
		flag =  true;
	delete []srcsrc;
	return flag;	
}

解法三:不需申请过多的空间,直接循环src,当循环到尾部时,跳转到头部即可

//解法三:直接依照src首尾相连进行遍历
bool findStr(char src[],char dst[], int srcLen , int dstLen)
{
	bool flag  = false;
	for(int i=0 ; i<srcLen ; i++){
		if(src[i] == dst[0]){//寻找首字母匹配
			flag = true;
			for(int j=1 ; j<dstLen ; j++){
				if(src[(i+j)%srcLen] != dst[j]){
					flag = false;
					break;
				}
			}
		}
		if(flag == true)//找到了这样的子序列,跳出循环
			break;
	}
	return flag;
}



           

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值