什么是在字符串中查找模式的更好方法?

时间:2015-09-15 21:39:46

标签: javascript string function

以下是我在一个给定字符串中查找不同长度模式的练习。我怎样才能改善它?有什么问题?这只是一个优化问题。

function find(pattern,str) {
   var  arr = [];
   for (i= 0;i<str.length;i++) {
      if(pattern== str.slice(i,pattern.length+i)) {
       arr.push([i,pattern.length-1+i]);
     };
  };
   if(!arr.length) { return false;} else { return arr;};
};


find('abfd','abfdffdabfdfaffab');

2 个答案:

答案 0 :(得分:1)

indexOf()方法返回搜索模式的位置,如果找不到模式,则返回-1:

<!DOCTYPE html>
<html>
<body>

<p>Click the button to locate where in the string a specifed value occurs.</p>

<button onclick="myFunction()">Try it</button>

<p id="demo"></p>

<script>
function find(pattern,str) {
   var pos = str.indexOf(pattern);
   return pos === -1 ? false : [pos, pos + pattern.length-1];
}
function myFunction() {
    var pos = find('dabfd', 'abfdffdabfdfaffab');      
    document.getElementById("demo").innerHTML = 'found: ' + pos;
}
</script>

</body>
</html>

答案 1 :(得分:0)

首先,你正在做str.length *(slice + compare * pattern.length),如果你在字符串中有太多的错误,这实在是效率很低。

对此代码的一些改进可以是:

  • 删除切片功能(假设它很贵,而且每步都不需要它。)
  • 在字符串中查找模式的第一个字符,然后仅在找到上一个字符后,将其余字符与char进行比较。
  • 对于字符串中所有出现的模式,模式长度已经相同,因此您可以只返回出现[(i, i+length)]而不是返回var中[i]的元组。 (因为调用者已经知道pattern.length)。
  • 或者更好的是,您可以实现具有复杂度O(n + k)的KMP algorithm