问题:(该问题转自《Algorithms(FourthEdition)》网站)
给定两个字符串x、y,设计一个算法来判断是否存在一对正整数m、n,使得x^m = y^n。这里x^m表示m个x相连接所形成的字符串。
在给出分析和解决方案之前我们先做一些约定:
1. 所有讨论都是在所涉及数据为正整数的前提下进行。
2. lcm(X, Y):整数X和Y的最小公倍数
gcd(X,Y):整数X和Y的最大公约数
3. 如果gcd(X, Y) = 1,则X和Y互质,不对X或Y等于1的情况进行区分。
分析:
如果确实存在满足要求的整数对,那么很明显,字符串x和y必然具有某些共性。因为x^m和y^n分别是由若干个x和若干个y连接而成,故可以知道一个字符串的开始部分必然与另一个字符串相同,且结束部分也必然与另一个字符串相同。更具体地说,对于y^n这个串,我们知道其首部是一个x,我们把这个x去掉,之后的首部还是一个x,而且这个过程可以一直做下去,直到串y^n用完。
由以上分析可以很容易地设计出以下算法:
算法一:
构造字符串x^m,其中m =lcm(|x|,|y|) / |x|,再构造字符串y^n,其中n = lcm(|x|,|y|) / |y|,然后检查二者是否相同。或是更简单的办法,构造完x^m后,检查它是否是若干个y的连接。
这个算法非常简单,可以算做是一种Brute-Force方法,并且利用了最小公倍数和整数的性质减少了运算。但这个算法可能需要很大的时空开销,而且当最小公倍数溢出时,也需要更复杂的处理。当然,也可以不去构造字符串x^m,直接在x上循环搜索y,直到二者同时到达结尾。这样额外的空间开销降为了O(1)。但运行时间并没有降低,最坏情况下,时间复杂度为O(lcm(|x|, |y|))。而lcm可能会很大,有时会接近|x|*|y|。
为了寻求更高效的方法,我们需要深入分析x和y的共性。假定存在m、n,使得x^m &