如何用Java实现一个函数来判断两个字符串是否为旋转关系?
题目描述
旋转关系是指字符串A循环移位任意若干位后能变成字符串B,反之亦成立。例如,字符串A=”abcd”,字符串B=”cdab“,”dabc“,”bcda“都是它的旋转。现给定两个字符串,请编写函数判断它们是否为旋转关系。
算法思路
1、假设字符串A和B的长度为n,则如果它们存在旋转关系,那么A和B中任选一个字符串进行n次循环移位后,一定能使得它们相同。
例如:
A="abcd",B="cdab"
如果A进行一次循环移位,可得到"B"+"c",即"Bc",B中的"d"与之对应。接着再将A进行一次循环移位,可得到“cB"+"d",即“cBd” ,B中的“a”与之对应,依次类推:将A进行第三次循环移位后,可得到“dB"+"a",即“dBa”,B中的“c”与之对应;最后,将A进行第四次循环移位后,可得到“Bd"+"c",即“Bdc”,B中的“b”与之对应。 那么,如果A与B存在旋转关系,则它们一定是中间有某次循环移位满足上述条件。
2、对于每一个字符串A和B,我们可以先将它们连接为新字符串AB,然后判断B是否是AB的子串,如果是,则AB一定是由A旋转后形成的,反之则不是。
例如:
若A="abcd",B="cdab",则连接形成新字符串AB="abcdcdab",而B="cdab"是AB的子串,因此可以得出A与B存在旋转关系。
算法实现
种方法实现代码:
public class Rotation {
public static boolean isRotation1(String A, String B) {
if(A.length() != B.length()) return false;
int n = A.length();
for(int i=0; i<n; i++){
String temp = A.substring(i, n) + A.substring(0,i);
if(temp.equals(B))
return true;
}
return false;
}
public static void main(String[] args){
String A = "abcd";
String B1 = "cdab";
String B2 = "dcab";
System.out.println(isRotation1(A,B1)); // true
System.out.println(isRotation1(A,B2)); // false
}
}
第二种方法实现代码:
public class Rotation {
public static boolean isRotation2(String A, String B) {
if(A.length() != B.length()) return false;
String AB = A + A;
return AB.contains(B);
}
public static void main(String[] args){
String A = "abcd";
String B1 = "cdab";
String B2 = "dcab";
System.out.println(isRotation2(A,B1)); // true
System.out.println(isRotation2(A,B2)); // false
}
}
两种方法的时间复杂度分别为O(n2)和O(n),相比之下,方法二的时间复杂度更低,效率更高。
