Javascript 为什么可以';我不能在字符串中找到子字符串吗?

Javascript 为什么可以';我不能在字符串中找到子字符串吗?,javascript,html,Javascript,Html,我只想知道子字符串是否存在于字符串中,而不使用任何库函数。我知道它非常简单,我以前在C、C++和java中已经做过。但是,我没有得到JavaScript的输出。我使用以下代码: <html> <body> <script type="text/javascript"> var j,i; var str=window.prompt("Enter the string: "); var substr=wind

我只想知道子字符串是否存在于字符串中,而不使用任何库函数。我知道它非常简单,我以前在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>

var j,i;
var str=window.prompt(“输入字符串:”);
var substr=window.prompt(“输入要搜索的字符串:”);
var len=str.length;
var SUBN=子段长度;
j=0,i=0;

whlie(i您有输入错误。
whlie(i您可以使用
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");
}
var-found=false;
i=0;
而(i

用于循环的紧凑型版本

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;
}
var-found=false;
对于(i=0;i

编辑:
-substr.length+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");
}

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

假设str=“RAVING\u RAVEN\u升起” 和substr=“RAVEN”

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


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;
  }
  • 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(i与E不匹配)

你不会在任何地方减少j,所以当i=7时,它不会像应该的那样尝试与R匹配,而是尝试与E匹配,这会导致它失败

虽然这是一个非常简单的解决方案(没有外部依赖),但如果考试的目的是检查您对算法的理解,而不是实现简单的算法,我建议您检查字符串匹配算法。相同的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;
  }
参考:


whlie(我为什么不直接使用indexOf或match而不是自己实现它?看起来你是在比较字符。因为这是为了考试。我们不能在考试中使用库函数。@user2923116,但它不是库…如果你没有得到输出,通常是因为语法错误。脚本的解析将在如果出现错误(某些浏览器会警告您)。-1用于regex。为什么需要用regex来衡量它?主要是因为这是我想到的第一件事。我猜“I”标志可能会很有用,因为您可以通过.toLower()模拟I标志对不起,我不明白。在你代码的第10行,将
whlie
更改为
while
,你的代码就会生效。非常感谢。我知道了。