Javascript 为什么可以';我不能在字符串中找到子字符串吗?
我只想知道子字符串是否存在于字符串中,而不使用任何库函数。我知道它非常简单,我以前在C、C++和java中已经做过。但是,我没有得到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
<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
,你的代码就会生效。非常感谢。我知道了。