龙空技术网

30.算法学习之旋转字符串(kmp)

躲了一辈子的雨 144

前言:

现在我们对“kmp算法讲义ppt”大约比较关切,同学们都想要剖析一些“kmp算法讲义ppt”的相关文章。那么小编同时在网上搜集了一些对于“kmp算法讲义ppt””的相关文章,希望看官们能喜欢,姐妹们一起来了解一下吧!

题目:给定两个字符串, A 和 B。A 的旋转操作就是将 A 最左边的字符移动到最右边。例如, 若 A = 'abcde',在移动一次之后结果就是'bcdea' 。如果在若干次旋转操作之后,A 能变成B,那么返回True。

说明:A,B字符串均有值,先不考虑空字符串情况。

示例:

输入: A = 'abcde', B = 'cdeab'输出: true

我的思路: 判断A旋转之后是否能变成B, 首先我们找到B字符串的首个字符, 获取其字符串在A字符串中的下标位置,然后根据该下标来调整字符串A,若调整后的A和B相同,则返回true。这个是我首先想到的解答方式,我们来看下代码:

public static boolean rotateString(String A, String B) {    		//找到B字符串的首个字母        char bStart = B.charAt(0);        StringBuilder sb = new StringBuilder();        for (int i = 0; i < A.length(); i++) {            if (A.charAt(i) == bStart) {                //调整A字符串,判断与B值是否相同                String a = A.substring(i) + sb.toString();                if (a.equals(B)) {                    return true;                }            }           //A字符串字符先存储            sb.append(A.charAt(i));        }        return false;    }

以上解答是我首先相当的方式,还有其他的解答方式吗?当然有,不考虑性能的话,我这里有一个很精彩的解答方式,代码如下:

  public static boolean rotateString2(String A, String B) {        return (A.length() == B.length()) && (A + A).contains(B);    }

怎么样,是不是眼前一亮, A+A之后 若包含字符串B,那么A字符串肯定可以通过移动变成字符串B。 nice!

然后呢,通过上面这个思路,我们可以看到题目突然就变成了字符串是否包含某个字符串, 这个是不是很熟悉, 比如说在1MB的文本中找到是否包含某个字符串C,那么我们肯定不能双循环去一个一个判断呀,所以这题目我们可以使用KMP算法来求解,代码如下:

//通过KMP算法判断 A+A是否包含Bpublic static boolean rotateString5(String A, String B) {        int[] nextSz = getNextSz(B);        int t = 0, j = 0;        A = A + A;        while (j < B.length() && t < A.length()) {            if (j == -1 || A.charAt(t) == B.charAt(j)) {                t++;                j++;                if (j == B.length() - 1) {                    return true;                }            } else {                j = nextSz[j];            }        }        return false;    }		// KMP算法的核心,求解next数组    public static int[] getNextSz(String str) {        int[] next = new int[str.length()];        next[0] = -1;        int i = 0, j = -1;        while (i < str.length() - 1) {            if (j == -1 || str.charAt(i) == str.charAt(j)) {                i++;                j++;                next[i] = j;            } else {                j = next[j];            }        }        return next;    }

以上就是我的全部解答了,这个题目还是很有意思的,特别是第二种解法,真的是打开思路,赞。

若文章有所错误,请各位大佬指出,谢谢!

也可以看我往篇的文章中的KMP题目

标签: #kmp算法讲义ppt