在不含JavaScript的include / indexOf / Regex的字符串中查找子字符串

时间:2019-01-15 22:23:52

标签: javascript algorithm

我想弄清楚子字符串是否在字符串中,而不使用includesindexOf(与它们类似的方法)或正则表达式的内置Javascript。基本上只是想学习一种算法方法。

这是我到目前为止所拥有的

function isSubstring(string, substring){
    substringIndex = 0;

    // loop through string
    for(let i = 0; i< string.length; i++){

       //check the current substring index if it matches 
       if(string[i] === substring[substringIndex]){
           substringIndex++
          //continue searching... Would i then have to call another function recursively?
       }

    }

}

我无法理解如何构建算法。一旦找到第一个匹配的字符,我就转到下一个,如果匹配则继续到字符串的下一个索引?然后,我需要一个与当前正在执行的循环分开的递归函数吗?我正在努力提高算法思维能力。谢谢。

5 个答案:

答案 0 :(得分:2)

许多方法都是可行的。这是一个:创建一个更简单的函数,该函数将检查first字符串是否在特定的指定位置,我们在start字符串中将其称为second。这非常简单:您将范围为0到长度first[i]-1的所有second[start+i]的{​​{1}}与i进行比较。

然后,第二步将是在从0到第二个字符串的长度的所有起始位置重复此功能,同时检查边界(在字符串结束后无法读取)。

当第一个版本可用时,您也可以稍后进行一些优化。 :-)

答案 1 :(得分:2)

以下是算法算法isSubstring的优化示例。它仅迭代所需的最少字符数。

例如,如果字符串的长度为20个字符,而子字符串的长度仅为5个字符,则当我们到达字符串的第16位时,我们可以假定子字符串在字符串中不存在(16 + 5 = 21> 20)

function isSubstring(str, sub){
  if(sub.length > str.length) return false;
  for(let i = 0; i < str.length - sub.length + 1; i++){
    if(str[i] !== sub[0]) continue;
    let exists = true;
    for(let j = 1; j < sub.length && exists; j++){
        if(str[i+j] === sub[j]) continue;
        exists = false;
    }
    if(exists) return true;
  }
  return false;
}

//expected true
console.log(isSubstring("hello world", "hello"));
console.log(isSubstring("hello world", "world"));
console.log(isSubstring("hello world", "d"));
console.log(isSubstring("hello world", "o w"));
console.log(isSubstring("hello world", "rl"));
console.log(isSubstring("hello world", ""));

//expected false
console.log(isSubstring("hello world", "hello world 1"));
console.log(isSubstring("hello world", "helloo"));

答案 2 :(得分:1)

在草堆length上的每次迭代中,使用slice从该索引中提取字符(索引加针的长度)。如果切片的字符串与针匹配,则返回true:

function isSubstring(string, substring) {
  for (let i = 0; i < string.length; i++) {
    const sliced = string.slice(i, i + substring.length);
    if (sliced === substring) {
      return true;
    }
  }
  return false;
}
console.log(isSubstring('foobar', 'oob'));
console.log(isSubstring('foobar', 'baz'));

答案 3 :(得分:1)

由于您对递归方法表达了兴趣,因此需要考虑以下事项。点击黄色的降价部分会显示扰流板。

function f(str, sub, i=0, j=0){
  if (j && j == sub.length)
  

return true;

  if (i == str.length)
  

return false;

  if (str[i] == sub[j])
    return f(str, sub,
  

i+1, j+1);

  return f(str, sub,
  

i+1, 0);

}

答案 4 :(得分:0)

    function isSubstring(str, sub) {
        return str.split(sub).length > 1
    }

不包含,不包含.indexOf,不包含RegExp。只是字符串。