字串的循环旋转

《算法导论》P594 第32.4-7题解

题:写出一个线性时间的算法,以确定文本 T 是否是另一个字符串 T‘ 的循环旋转。例如 arc 和 car 是彼此的循环旋转。

思路很简单:

分两步走:1.先确定匹配起点。如果T是T'的循环旋转,那么在T中一定会找到T'[0]的匹配起点。

                  2.找到匹配起点后,分别指向T与T'的遍历指针同时移动并比较其对应的字符是否相等,不相等,则返回                            false,直到T' 所有字符都遍历完才返回真。

如图:


代码如下:

bool isLoop(const string& str1, const string& str2)//这里str1对应T',  str2对应T
{
	int size1 = str1.size();
	int size2 = str2.size();
	int i1 = 0;
	int i2 = 0;
	if (size1 != size2) return false;//如果长度不一,那么一定不是循环的

	while (str2[i2])//找起始匹配点
	{
		if (str1[i1] == str2[i2])
			break;
		++i2;
	}
	if (i2 == size2) return false;//说明找不到匹配起点,返回false;否则找到
	++i1;
	++i2;
	while (str1[i1])//找到起点,开始匹配
	{
		if (i2 == size2)//循环查看
		    i2 = 0;
		if (str1[i1] != str2[i2])//只要有一个不对应相等,就返回false
			return false;
		++i1;
		++i2;
	}
	return true;
			
}



从上面代码可以看出来,算法时间复杂度是O(n)。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值