另一种选择是KMP公司(Knuth–Morris–Pratt)。
KMP算法搜索长度-米长度中的子串-n个最坏情况O中的字符串(n个+米)时间,与O的最坏情况相比(n个⋅米)对于朴素算法,如果您关心最坏情况下的时间复杂性,那么使用KMP可能是合理的。
下面是Nayuki项目的JavaScript实现,摘自https://www.nayuki.io/res/knuth-morris-pratt-sting-matching/kmp-string-matcher.js:
//使用Knuth-Morris-Pratt字符串匹配算法在给定文本字符串中搜索给定模式字符串。//如果找到模式,则返回“text”中最早匹配的开始的索引。否则返回-1。
功能kmpSearch(模式、文本){if(pattern.length==0)返回0;//即时匹配//计算最长后缀前缀表var lsp=[0];//基本情况for(var i=1;i<模式长度;i++){var j=lsp[i-1];//首先假设我们正在扩展以前的LSPwhile(j>0&&模式[i]!==模式[j])j=lsp[j-1];if(模式[i]===模式[j])j++;lsp.推动(j);}//遍历文本字符串变量j=0;//模式中匹配的字符数for(变量i=0;i<文本长度;i++){while(j>0&&text[i]!=模式[j])j=lsp[j-1];//回到模式中if(文本[i]==图案[j]){j++;//匹配的下一个字符,递增位置如果(j==图案长度)返回i-(j-1);}}返回-1;//找不到}console.log(kmpSearch('ays','haystack')!=-1) //真console.log(kmpSearch('asdf','haystack')!=-1) //错误