您的位置:首页 > 其它

模式匹配

2017-04-05 19:11 141 查看
模式匹配

public class Demo04 {
public static void main(String[] args) {
int pos = bf("ccnu ylpgogo... yes. .", "12ypl1");
System.out.println(pos);
int pos1 = bf1("I am a boy.", "bo");
System.out.println(pos1);
int pos2 = kmp("I am a girl.", "girl");
System.out.println(pos2);
int[] next = getNext("ababaaaba");
for (int i : next) {
System.out.print(i + " ");
}
}

public static int bf(String s, String p){ // Brute Force
if(s == null || p == null || s.length() == 0 || p.length() == 0){
return -1;
}
if(s.length() < p.length()){
return -1;
}
int sLen = s.length();
int tLen = p.length();
for(int i = 0; i < (sLen - tLen + 1); i++){
for(int ii = 0; ii < tLen; ii++){
if(s.charAt(i + ii) != p.charAt(ii)){
break;
}
if(ii == tLen - 1){
return i;
}
}
}
return -1;
}

public static int bf1(String s, String p) {
if (s == null || p == null || s.length() == 0 || p.length() == 0) {
return -1;
}
if (s.length() < p.length()) {
return -1;
}
int sLen = s.length();
int pLen = p.length();
int iS = 0;
int iP = 0;
while (iS < (sLen - pLen + 1) && iP < pLen) {
if (s.charAt(iS) == p.charAt(iP)) {
iS++;
iP++;
} else {
iS = iS - iP + 1;
iP = 0;
}
}
if (iP == pLen) {
return iS - iP;
} else {
return -1;
}
}

public static int kmp(String s, String p){ // KMP
if(s == null || p == null || s.length() == 0 || p.length() == 0){
return -1;
}
if(s.length() < p.length()){
return -1;
}
int[] next = getNext(p);
int sLen = s.length();
int pLen = p.length();
int i = 0;
int j = 0;
while(i < sLen && j < pLen){
if(j == -1 || s.charAt(i) == p.charAt(j)){
i++;
j++;
}else{
j = next[j];
}
}
if(j == pLen){
return i - j;
}else{
return -1;
}
}

public static int[] getNext(String t){ // ababaaaba-->0 0 1 1 2 3 4 2 2 3
int[] next = new int[t.length()];
int i = -1; // 前缀开始位置
int j = 0; // 后缀开始位置
next[j] = -1;
while(j < t.length() - 1){
if(i == -1 || t.charAt(i) == t.charAt(j)){
i++;
j++;
next[j] = i;
}else{
i = next[i];
}
}
return next;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  pattern matching