您的位置:首页 > 编程语言

编程之美--字符串循环移位包含问题

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);

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: