前言:
现在我们对“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