我想弄清楚子字符串是否在字符串中,而不使用includes
,indexOf
(与它们类似的方法)或正则表达式的内置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?
}
}
}
我无法理解如何构建算法。一旦找到第一个匹配的字符,我就转到下一个,如果匹配则继续到字符串的下一个索引?然后,我需要一个与当前正在执行的循环分开的递归函数吗?我正在努力提高算法思维能力。谢谢。
答案 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。只是字符串。