string-matching - JavaScript substring - 如何在JavaScript中检查一个字符串是否包含子串?

Java substring / javascript / string / substring

通常我希望使用 String.contains() 方法,但是似乎没有。

29 revs, 19 users 18%



Answer #1

这是Nayuki项目的JavaScript实现,取自https://www.nayuki.io/res/knuth-morris-pratt-string-matching/kmp-string-matcher.js

//使用Knuth-Morris-Pratt字符串匹配算法在给定的文本字符串中搜索给定的模式字符串。
//如果找到了模式,则返回'text'中最早匹配项开始的索引。否则返回-1。
function kmpSearch(pattern, text) {
  if (pattern.length == 0)
    return 0; //立即比赛

  //计算最长的后缀前缀表
  var lsp = [0]; // 基本情况
  for (var i = 1; i < pattern.length; i++) {
    var j = lsp[i - 1]; //首先假设我们要扩展先前的LSP
    while (j > 0 && pattern.charAt(i) != pattern.charAt(j))
      j = lsp[j - 1];
    if (pattern.charAt(i) == pattern.charAt(j))
      j++;
    lsp.push(j);
  }

  //遍历文本字符串
  var j = 0; //模式匹配的字符数
  for (var i = 0; i < text.length; i++) {
    while (j > 0 && text.charAt(i) != pattern.charAt(j))
      j = lsp[j - 1]; //退回模式
    if (text.charAt(i) == pattern.charAt(j)) {
      j++; //下一个字符匹配,递增位置
      if (j == pattern.length)
        return i - (j - 1);
    }
  }
  return -1; // 未找到
}

console.log(kmpSearch('ays', 'haystack') != -1) // 真的
console.log(kmpSearch('asdf', 'haystack') != -1) // 错误的