《算法导论》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)。