欢迎访问宙启技术站
智能推送

如何用Java实现一个函数来判断两个字符串是否为旋转关系?

发布时间:2023-06-23 11:38:30

题目描述 

旋转关系是指字符串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),相比之下,方法二的时间复杂度更低,效率更高。