📜  在Java中检查字符串旋转(1)

📅  最后修改于: 2023-12-03 15:07:53.952000             🧑  作者: Mango

在Java中检查字符串旋转

有时候我们需要检查一个字符串是否是另一个字符串旋转得到的。例如,字符串 abcdecdeab 就是相互旋转得到的。这时候我们就需要用到一些字符串操作的方法来判断这种旋转情况。在Java中,有多种方法可以实现这个目的,本文将介绍其中的两种方法。

方法一:暴力枚举

暴力枚举指的是对于每一种可能的旋转情况都进行比较判断,直到找到相同的字符串。这种方法虽然简单易懂,但是时间复杂度比较高。

代码如下:

public boolean isRotation(String s1, String s2) {
    if (s1 == null || s2 == null) {
        return false;
    }
    if (s1.length() != s2.length()) {
        return false;
    }
    return (s1 + s1).contains(s2);
}

代码中,首先判断了两个字符串是否为 null 或者长度是否相同,如果不满足条件,则返回 false。接下来,利用 String 类的 contains() 方法判断 s1 + s1 是否包含 s2 字符串,如果包含,则返回 true,否则返回 false。

方法二:KMP算法

KMP算法是一种高效的字符串匹配算法,同样可以用于判断字符串是否旋转得到。具体实现方式如下:

代码如下:

public boolean isRotation(String s1, String s2) {
    if (s1 == null || s2 == null) {
        return false;
    }
    if (s1.length() != s2.length()) {
        return false;
    }
    String s = s1 + "#" + s2;
    int[] next = new int[s.length()];
    getNext(s.toCharArray(), next);
    return next[s.length() - 1] == s1.length();
}

private void getNext(char[] s, int[] next) {
    int j = 0;
    next[0] = 0;
    for (int i = 1; i < s.length; i++) {
        while (j > 0 && s[i] != s[j]) {
            j = next[j - 1];
        }
        if (s[i] == s[j]) {
            j++;
        }
        next[i] = j;
    }
}

KMP算法中需要用到求解 next 数组的方法,实现代码如下:

private void getNext(char[] s, int[] next) {
    int j = 0;
    next[0] = 0;
    for (int i = 1; i < s.length; i++) {
        while (j > 0 && s[i] != s[j]) {
            j = next[j - 1];
        }
        if (s[i] == s[j]) {
            j++;
        }
        next[i] = j;
    }
}

KMP算法中,将 s1 和 s2 组成字符串 s,并在中间添加了一个特殊字符#,然后用 getNext() 方法求解 s 的 next 数组。然后判断 next 数组的最后一个元素是否等于 s1 的长度,如果是,则说明 s2 是由 s1 旋转得到的,返回 true,否则返回 false。

总结

本文介绍了在Java中检查字符串是否旋转得到的两种方法:暴力枚举和KMP算法。在实际开发中,应该根据具体情况选用不同的方法。对于字符串比较短的情况,可以使用暴力枚举;对于字符串比较长的情况,建议使用 KMP算法。