编程之美--字符串循环移位包含问题
2012-10-24 17:06
127 查看
package structure; import java.util.Arrays; /** * * 字符串移位包含问题 问题:string a = "aabcd" ,string b = "cdaa" 判断将 a 字符串通过循环移位能否包含 串 b * 解法1:对 a 进行每次移位,然后再与 b 进行包含判断,这里利用KMP 进行匹配处理 解法2:a 的循环移位一定是 aa 的子串,如果 b 可以被 a * 的循环移位串包含,那么 b 一定是 aa 的子串 */ public class StringSiftCompare { public static void execute(String a, String b) { char[] s1 = a.toCharArray(); char[] s2 = b.toCharArray(); int[] next = next(s2); for (int i = 0, len = s1.length; i < len; i++) { int ans = kmp(s1, s2, next); if (ans != -1) { System.out.println("Yes"); return; } leftSift(s1); } System.out.println("No"); } /** * 多次匹配,没必要把 next 方法写在 kmp 中 */ static int kmp(char[] s1, char[] s2, int[] next) { int j = 0; for (int i = 0, len = s1.length; i < len; i++) { while (j >= 0 && s1[i] != s2[j]) { j = next[j]; } if (j < 0) j = 0; else j++; if (j == s2.length) return i - j + 1; } return -1; } static int[] next(char[] s) { int len = s.length; int[] next = new int[len]; next[0] = -1; for (int i = 1; i < len; i++) { // 求 next[i],next[i] = next[i-1]+1 int j = i - 1; while (j >= 0 && s[next[j] + 1] != s[i]) { j = next[j]; } if (j >= 0) next[i] = next[j] + 1; else next[i] = -1; } return next; } static void leftSift(char[] s) { int last = s.length - 1; char t = s[last]; System.arraycopy(s, 0, s, 1, last - 1); s[0] = t; } static void execute2(String a, String b) { a = a + a; int ans = a.indexOf(b); System.out.println(ans >= 0 ? "Yes" : "No"); } public static void main(String args[]) { String a = "AABCD", b = "BCD"; //execute(a, b); execute2(a,b); } }
相关文章推荐
- 《编程之美》- 3.1 - 字符串移位包含的问题
- 编程之美3.1字符串移位包含问题
- 字符串循环移位包含问题
- 编程之美3.1 字符串移位包含问题
- 编程之美3.1 字符串移位包含问题
- 字符串移位包含的问题(编程之美)
- 编程之美“字符串移位包含的问题”的另一种解法
- 编程之美——3.1字符串移位包含问题
- 编程之美3.1——字符串移位包含的问题(KMP算法)
- 《编程之美》--字符串移位包含的问题
- 《编程之美》——3.1字符串移位包含的问题
- 编程之美3.1—字符串移位包含问题
- 编程之美——字符串移位包含问题
- 《编程之美》3.1 字符串移位包含的问题
- Bailian3711 字符串移位包含问题【字符串循环匹配】(POJ NOI0107-19)
- 编程之美——字符串移位包含问题
- 编程之美-3.1字符串移位包含问题
- 编程之美3.1 字符串移位包含的问题
- 编程之美——3.1字符串移位包含问题
- 编程之美第三章-字符串移位包含的问题