public class kmp {
public static void main(String[] args){
// 01234567
String text = "i am a batman!";
String sub = "batman";
KmpAlgorithm kmp = new KmpAlgorithm(text, sub);
int index = kmp.KMP();
System.out.println(index);
}
/***
* 有两个串 string 和 subString
* 若sub存在于string里 则返回其下标
* 否则返回-1
*
*/
static class KmpAlgorithm{
public String text,subString;
public KmpAlgorithm(String text, String subString){
this.text = text;
this.subString = subString;
}
int[] getNext(){
int[] next = new int[subString.length()];
int j = 0;
for(int i = 1 ; i < subString.length() ; ++i){
while(subString.charAt(i) != subString.charAt(j) && j > 0)
j = next[j-1];
if(subString.charAt(i) == subString.charAt(j)) j++;
next[i] = j;
}
return next;
}
int KMP(){
if(subString.length() == 0) return 0;
int j = 0;
int[] next = getNext();
for(int i = 0; i < text.length(); ++i){
while(text.charAt(i) != subString.charAt(j) && j > 0)
j = next[j-1];
if(text.charAt(i) == subString.charAt(j))
j++;
if(j == subString.length())
return i - subString.length() + 1;
}
return -1;
}
}
}
自用留档
该代码实现了一个KmpAlgorithm类,用于在给定的文本中查找子串batman的位置。KMP算法通过构建next数组优化了匹配过程,避免了不必要的字符比较。当找到匹配的子串时,返回其在文本中的起始下标,否则返回-1。
10万+

被折叠的 条评论
为什么被折叠?



