为什么我找不到字符串中的子字符串?

时间:2014-01-19 04:58:47

标签: javascript html

我只想查找字符串中是否存在子字符串,而不使用任何库函数。我知道它非常简单,我以前用C,C ++和Java完成了这个。但是,我没有得到JavaScript的输出。我使用以下代码:

<html>
<body>
    <script type="text/javascript">
        var j,i;
        var str=window.prompt("Enter the string: ");
        var substr=window.prompt("Enter the string to be searched: ");
        var len=str.length;
        var sublen=substr.length;
        j=0,i=0; 
        whlie(i<len)
        {
            if(str[i]==substr[j])
            {
                i++;
                j++;
            }
            else
            {
                i++;
            }
        }
        if(j==sublen)
        {
            document.write("Substring found");
        }
        else
        {
            document.write("Substring not found");
        }
    </script>
</body>

任何人都可以告诉我,这段代码有什么不对。提前谢谢..

5 个答案:

答案 0 :(得分:3)

你有一个错字。 whlie(i<len)应为while(i<len)

此外,还有更简单的方法,如评论中所述。

答案 1 :(得分:3)

您可以使用indexOf()功能

var str=window.prompt("Enter the string: ");
var substr=window.prompt("Enter the string to be searched: ");
if( str.indexOf(substr) > -1 ){
    document.write("Substring found");
}
else{
    document.write("Substring not found");
}

如果你想在 while循环中而不是使用indexOf()这样做...试试这个

var found = false;
i = 0;
while( i < str.length - substr.length + 1 )
{
    if(str[i]==substr[0])
    {
        j = 0;
        found = true;
        while( j < substr.length ){
            if( str[i+j] != substr[j] ){
                found = false;
                break;
            }
            j++;
        }
    }
    if( found == true ) break;
    i++;
}

if( found == true ){
    document.write("Substring found");
}
else{
    document.write("Substring not found");
}

紧凑 for loop 版本

var found = false;      
for( i=0; i < str.length - substr.length + 1 ; i++){
    if( str[i] == substr[0] )
        for( j=0, found=true; j < substr.length; j++)
            if( str[i+j] != substr[j] ){
                found = false;
                break;
            }
    if( found ) break;
}

编辑: - substr.length + 1在两个版本的外部循环中添加。

答案 2 :(得分:0)

除了while的拼写错误之外,你的实现在逻辑上是不正确的,因为一旦有部分匹配,它就会从它离开的点开始下一个匹配。

假设str =“RAVING_RAVEN_RISES” 和substr =“RAVEN”

现在,您的代码迭代过程如下:

  • i = 0,j = 0
  • i = 1,j = 1(R与R匹配)
  • i = 2,j = 2(A与A匹配)
  • i = 3,j = 3(V与V匹配)
  • i = 4,j = 3(我与E不匹配)

...

你不会在任何地方递减j,所以当i = 7时,它不会尝试与R匹配,而是尝试与E匹配,导致它失败。

虽然String.prototype.indexOf是一个非常简单的解决方案(没有外部依赖关系),但如果考试的目的是检查您对算法的理解,而不是实现一个天真的算法,我建议您查看{{ 3}}字符串匹配算法。 javascript实现如下:


function kmp_search(s, w) {
      var m = 0, i = 0, 
          pos, cnd, t,
          slen = s.length,
          wlen = w.length;

      /* String to array conversion */
      s = s.split("");
      w = w.split("");    

      /* Construct the lookup table */
      t = [-1, 0];
      for ( pos = 2, cnd = 0; pos  0 )
            cnd = t[cnd];
          else 
            t[pos++] = 0;
      } 

      /* Perform the search */
      while ( m + i  -1 ) 
                  i = t[i];
              else
                  i = 0;
          }
      }
      return -1;
  }

参考:Knuth Morris Pratt

答案 3 :(得分:0)

  

whlie(i<len) it will be while(i < len)

答案 4 :(得分:-1)

你可以用正则表达式很容易地做到这一点。不需要额外的库。

var str = window.prompt("Enter the string: "),
  substr = window.prompt("Enter the string to be searched: "),
  substrR = new RegExp(substr);

if (substrR.test(str)) {
  document.write("Substring found");
} 
else {
  document.write("Substring not found");
}