简单串模式匹配算法
package com.test;
public class Test {
/**
* 一个普通的模式匹配算法
* @param str 主串
* @param sub 模式串
* @param pos 位置
* @return 模式串的匹配的首个开始位置
*/
public static int indexOf1(String str, String sub, int pos){
int i = pos;
int j= 0;
while(i < str.length() && j < sub.length()){
if(str.charAt(i) == sub.charAt(j)){
++i;
++j;
}else{
i = i - j + 1;// j刚好可以记录i先前走了几步,利用j可以回溯指针i。
j= 0;
}
}
if(j == sub.length()){// 匹配的话,j刚好=sub最后下标+1(sub长度)
return i - sub.length();
}
return -1;
}
/**
* /java indexOf源码算法,进行了命名改动和变量简化
* 一个普通的模式匹配算法
* @param str 主串
* @param sub 模式串
* @param pos 位置
* @return 模式串的匹配的首个开始位置
*/
public static int indexOf2(String str, String sub, int pos){
int strLen = str.length();
int subLen = sub.length();
//两个边界处理
if (pos >= strLen) {
return (subLen == 0 ? strLen : -1);
}
if (pos < 0) {
pos = 0;
}
//特殊值处理
if (subLen == 0) {
return pos;
}
char first = sub.charAt(0);//模式串第一个字符
int max = strLen - subLen;//母串不必匹配到最后一个字符
for (int i = pos; i <= max; i++) {
/* 查找第一个字符 */
if (str.charAt(i) != first) {
while (++i <= max && str.charAt(i) != first);
}
/* 找到第一个字符,现在找模式串的第二个字符 */
if (i <= max) {
int j = i + 1;
int end = j + subLen - 1;
for (int k = 1; j < end && str.charAt(j) == sub.charAt(k); j++, k++);
if (j == end) {
/* 找到了整个串 */
return i;
}
}
}
return -1;
}
public static void main(String[] args) {
System.out.println(indexOf1("ababbabacc", "bb", 0));
System.out.println(indexOf2("ababbabacc", "bb", 0));
}
}
。