前几天在研究模板匹配的算法,接触了BF,KPM,BM,BMH,BMHS算法,所以就想来记录一下,顺便加强对算法的理解。如果理解有什么问题还请大家指正。
BF算法又称为朴素模式匹配算法,这是最简单的模式匹配算法。它的想法是很简单的,所以基本上和暴力匹配有点类似。
如图的匹配方式,用i作为记录模板匹配到文本的具体位置,用两个指针j和k进行字母配对,顺序从文本的头到尾遍历,首字母和尾字母相同则进行字母的匹配。以下是java实现的程序。
public int strStr(String haystack, String needle) {
if(haystack == null || needle == null)
return -1;
if(haystack.equals("") && needle.equals(""))
return 0;
if(needle.equals(""))
return 0;
if(haystack.equals(""))
return -1;
char[] source = haystack.toCharArray();
char[] target = needle.toCharArray();
int source_len = haystack.length();
int target_len = needle.length();
if(source_len < target_len)
return -1;
if(source_len == target_len)
{
if(haystack.equals(needle))
return 0;
else
return -1;
}
char firstChar = target[0];
char lastChar = target[target_len - 1];
for(int i = target_len - 1; i < source_len; i++)
{
int j = i - target_len + 1;
if(source[j] != firstChar)
continue;
if(source[i] != lastChar)
continue;
int k = 0;
for(;j < i; j++,k++)
{
if(source[j] != target[k])
break;
}
if(j == i)
return j - target_len + 1;
}
return -1;
}
如果想要测试是否正确,同时要保证数据量,可以去leetcode上进行测试,
这是网址
顺便提一句,java中的string.indexof()的实现源代码与此类似。