前缀子串与后缀子串
- 前缀子串:从字符串头开始的子串。
例如字符串:abcdef
那么它的前缀子串为:a,ab,abc,abcd - 后缀子串: 从字符串尾开始的子串。
还是拿字符串abcdef举栗子
它的后缀子串为:f,ef,def
求前缀与后缀公共子串有什么用
在BM算法中,它完成了好后缀规则里的一部分工作。这个算法是干什么的?它是用来匹配字符串的,比BF算法(这个算法就是从主串首位开始比较模式串,匹配失败,则从第二位开始继续匹配模式串)强太多了~
代码
public class BM {
/**
*
* @param b
* @param suffix 它的下标代表前缀长度 值存储的是前缀子串匹配的起始位置
* @param prefix 下标代表前缀长度 值存储的是 记录后缀子串是否能匹配前缀子串
* @return
*/
public static String find(char[] b, int[] suffix, boolean[] prefix) {
// 为什么是b.length - 1 也就是到 倒数第二位元素为止
// 如果到倒数第一位,那我还求神马? so,length - 1
for (int i = 0; i < b.length -1; i++) {
int j = i;
int k = 0; // 公共后缀长度
while (j >= 0 && b[j] == b[b.length - k - 1]) {
suffix[k] = j;//j 表示后缀子串在b[0,i]的起始下标
--j;
++k;
}
if (j == -1) { //如果j-1了那么长度为k的子串匹配成功
prefix[k] = true;
}
}
int max = -1;
for (int i = 0; i < prefix.length; i++) {
if (prefix[i] == true) {
max = i;
}
}
if (max == -1) {
return "";
} else {
return new String(b, 0, max);
}
}
public static void main(String[] args) {
char[] b = new char[]{'a','b','c','a','b','c'};
int[] suffix = new int[b.length];
boolean[] preifx = new boolean[b.length];
String s = find(b, suffix, preifx);
System.out.println(s);
}
}
字符串匹配的Boyer-Moore算法
这篇我还没看,改天补一下。