簡體   English   中英

在 Javascript 中不帶 includes/indexOf/Regex 的字符串中查找 substring

[英]Find substring in string without includes/indexOf/Regex in Javascript

我想弄清楚 substring 是否在字符串中,而不使用 Javascript 的內置方法includesindexOf ,(任何類似的)或正則表達式。 基本上只是想學習一種算法方法。

這是我到目前為止所擁有的

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?
       }

    }

}

我無法理解如何構建算法。 一旦找到匹配的第一個字符,我將 go 到下一個,如果它匹配繼續到字符串的下一個索引? 然后我需要一個與我當前正在做的循環分開的遞歸 function 嗎? 我正在努力提高算法思維。 謝謝。

許多方法都是可能的。 這是一個:創建一個更簡單的函數,該函數將檢查first字符串是否在特定的指定位置,讓我們在second字符串中將其稱為start 非常簡單:對於范圍為0到first -1的所有i ,您將first[i]second[start+i]進行比較。

然后,第二步將是在從0到第二個字符串的長度的所有起始位置重復此功能,同時檢查邊界(在字符串結束后無法讀取)。

當第一個版本可用時,您也可以稍后進行一些優化。 :-)

這是算法算法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", "ow")); 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")); 

在干草堆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')); 

由於您對遞歸方法表達了興趣,因此需要考慮一些事項。 單擊黃色的降價部分會顯示擾流板。

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);

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

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

只使用一個循環偽代碼:

 const containSubstr = (str, substr) => { let count = 0; let i = 0; let startIndex = 0; while (i < str.length) { if (substr[count] === str[i]) { if (count === substr.length - 1) { return true; } count++; } else { count = 0; i = startIndex; startIndex++; } i++; } return false; }; console.log(containSubstr("ababad", "abad"));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM