当前位置:   article > 正文

JS 中几种常见的字符串匹配算法_js字符串匹配

js字符串匹配

下面是在 JavaScript 中实现几种常见的字符串匹配算法的示例:

1. 简单的字符串匹配(暴力匹配算法):

  1. function bruteForceStringMatch(text, pattern) {
  2.   const n = text.length;
  3.   const m = pattern.length;
  4.   for (let i = 0; i <= n - m; i++) {
  5.     let j;
  6.     for (j = 0; j < m; j++) {
  7.       if (text[i + j] !== pattern[j]) {
  8.         break;
  9.       }
  10.     }
  11.     if (j === m) {
  12.       return i;
  13.     }
  14.   }
  15.   return -1;
  16. }
  17. const text = "Hello, world!";
  18. const pattern = "world";
  19. console.log(bruteForceStringMatch(text, pattern)); // 输出:7

2. Knuth-Morris-Pratt (KMP) 算法:

  1. function computeLPSArray(pattern) {
  2.   const m = pattern.length;
  3.   const lps = Array(m).fill(0);
  4.   let len = 0;
  5.   let i = 1;
  6.   while (i < m) {
  7.     if (pattern[i] === pattern[len]) {
  8.       len++;
  9.       lps[i] = len;
  10.       i++;
  11.     } else {
  12.       if (len !== 0) {
  13.         len = lps[len - 1];
  14.       } else {
  15.         lps[i] = 0;
  16.         i++;
  17.       }
  18.     }
  19.   }
  20.   return lps;
  21. }
  22. function KMPSearch(text, pattern) {
  23.   const n = text.length;
  24.   const m = pattern.length;
  25.   const lps = computeLPSArray(pattern);
  26.   let i = 0;
  27.   let j = 0;
  28.   while (i < n) {
  29.     if (pattern[j] === text[i]) {
  30.       i++;
  31.       j++;
  32.     }
  33.     if (j === m) {
  34.       return i - j;
  35.     } else if (i < n && pattern[j] !== text[i]) {
  36.       if (j !== 0) {
  37.         j = lps[j - 1];
  38.       } else {
  39.         i++;
  40.       }
  41.     }
  42.   }
  43.   return -1;
  44. }
  45. const text = "Hello, world!";
  46. const pattern = "world";
  47. console.log(KMPSearch(text, pattern)); // 输出:7

3. Boyer-Moore 算法:

  1. function buildBadCharTable(pattern) {
  2.   const table = {};
  3.   for (let i = 0; i < pattern.length; i++) {
  4.     table[pattern[i]] = pattern.length - 1 - i;
  5.   }
  6.   return table;
  7. }
  8. function BMStringMatch(text, pattern) {
  9.   const n = text.length;
  10.   const m = pattern.length;
  11.   const badCharTable = buildBadCharTable(pattern);
  12.   let i = m - 1;
  13.   while (i < n) {
  14.     let j = m - 1;
  15.     while (j >= 0 && pattern[j] === text[i]) {
  16.       j--;
  17.       i--;
  18.     }
  19.     if (j === -1) {
  20.       return i + 1;
  21.     }
  22.     i += Math.max(badCharTable[text[i]] || m, 1);
  23.   }
  24.   return -1;
  25. }
  26. const text = "Hello, world!";
  27. const pattern = "world";
  28. console.log(BMStringMatch(text, pattern)); // 输出:7

4. Rabin-Karp 算法:

以下是 JavaScript 中的 Rabin-Karp 算法示例代码:

  1. const prime = 101; // 选取一个质数作为进制
  2. function RabinKarpSearch(text, pattern) {
  3.   const n = text.length;
  4.   const m = pattern.length;
  5.   const patternHash = hash(pattern, m);
  6.   let textHash = hash(text, m);
  7.   for (let i = 0; i <= n - m; i++) {
  8.     if (textHash === patternHash && checkEqual(text, i, pattern, 0, m)) {
  9.       return i;
  10.     }
  11.     if (i < n - m) {
  12.       textHash = recalculateHash(text, i, i + m, textHash, m);
  13.     }
  14.   }
  15.   return -1;
  16. }
  17. function hash(str, len) {
  18.   let hashValue = 0;
  19.   for (let i = 0; i < len; i++) {
  20.     hashValue += str.charCodeAt(i) * Math.pow(prime, i);
  21.   }
  22.   return hashValue;
  23. }
  24. function recalculateHash(str, oldIndex, newIndex, oldHash, len) {
  25.   let newHash = oldHash - str.charCodeAt(oldIndex);
  26.   newHash = newHash / prime;
  27.   newHash += str.charCodeAt(newIndex) * Math.pow(prime, len - 1);
  28.   return newHash;
  29. }
  30. function checkEqual(str1, start1, str2, start2, len) {
  31.   for (let i = 0; i < len; i++) {
  32.     if (str1[start1 + i] !== str2[start2 + i]) {
  33.       return false;
  34.     }
  35.   }
  36.   return true;
  37. }
  38. const text = "Hello, world!";
  39. const pattern = "world";
  40. console.log(RabinKarpSearch(text, pattern)); // 输出:7

Rabin-Karp 算法使用了哈希函数来计算模式串和文本串的哈希值,然后在文本串上滑动模式串进行匹配。如果哈希值匹配,则进一步检查模式串和文本串是否完全匹配。这样可以减少字符串比较的次数,提高算法的效率。Rabin-Karp 算法的时间复杂度可以达到 O(n+m),其中 n 是文本长度,m 是模式长度。


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/484247
推荐阅读
相关标签
  

闽ICP备14008679号