簡體   English   中英

不使用任何標准JavaScript方法檢查字符串是否包含子字符串?

[英]Check if string contains substring without using any standard JavaScript methods?

所以我需要實現一個javascript方法,該方法將根據masterString是否包含subString返回true或false。

我做了一些類似的事情,但是不確定這是否是正確的方法:

function contains(masterString, subString) {
if(subString.length > masterString.length){
    return false;
}
for(var i=subString.length-1; i<masterString.length; i++){
    if(concatString(i - subString.length-1, i, masterString) === subString){
        return true;
    }
}
  return false;

}

function concatString(index1, index2, string){
    var conString = '';
  console.log(index1, index2-1, string);
    for(var i=index1; i<index2-1; i++){
        conString += string[i];
    }
  console.log(conString);
    return conString;
}


contains('abcd', 'bc');

但是它不能正常工作。

我們可以實施嗎? 謝謝 :)

對於每個可能的索引,測試subString是否在masterString的索引上。

var indexOf = function(masterString,subString){
    for(var i = 0 ; i < masterString.length - subString.length + 1; i++){
        var match = true;
        for(var j = 0; j < subString.length; j++){
            if(masterString[i + j] !== subString[j]){
                match = false;
                break;
            }
        }
        if(match)
            return i;
    }   
    return -1;
}       

var contains = function(master,sub){ 
    return indexOf(master,sub) !== -1; 
}

注意:有更快的算法可以實現,例如Knuth–Morris–Pratt。

您可以使用嵌套循環:

function contains(masterString, subString) {
  outerloop:
  for(var i=0; i <= masterString.length-subString.length; ++i) {
    for(var j=0; j<subString.length; ++j)
      if(masterString[i + j] !== subString[j]) continue outerloop;
    return true;
  }
  return false;
}

當然,使用本機方法可以實現更好的性能。

您有一個好的解決方案。 但我認為我的工作容易些。

順便說一句:我認為.length也是一個JavaScript函數。

 function length(string){ var count = 0; while(string[count] != undefined) count++; return count; } function contains(masterString, subString) { var masterStringLength = length(masterString); var subStringLength = length(subString); for(var i = 0; i <= masterStringLength - subStringLength; i++) { var count = 0; for(var k = 0; k < subStringLength; k++) { if(masterString[i + k] == subString[k]) count++; else break; } if(count == subStringLength) return true; } return false; } console.log(contains('abcdefgh', 'bcde')); console.log(contains('abcdefgh', 'ab')); console.log(contains('abcdefgh', 'fgh')); 

這是類似的最長公共子見本 該代碼解決了您的問題。

 function contains(masterString, subString) { if (findCommonSubsequence(masterString, subString) == subString) alert(true); else alert(false); } function findCommonSubsequence(a, b) { var table = [], aLen = a.length, bLen = b.length; squareLen = Math.max(aLen, bLen); // Initialize a table of zeros for (var i = 0; i <= squareLen ; i++) { table.push([]); for (var j = 0; j <= squareLen; j++) { table[i][j] = 0; } } // Create a table of counts for (var i = 1; i <= aLen; i++) { for (var j = 1; j <= bLen; j++) { if (a[i - 1] == b[j - 1]) { table[i][j] = table[i - 1][j - 1] + 1; } else { table[i][j] = Math.max(table[i - 1][j], table[i][j - 1]); } } } // Move backwards along the table i = aLen, j = bLen, LCS = []; while (i > 0 && j > 0) { if (a[i - 1] == b[j - 1]) { LCS.push(a[i - 1]); i -= 1; j -= 1; } else { if (table[i][j - 1] >= table[i - 1][j]) { j -= 1; } else { i -= 1; } } } return(LCS.reverse().join('')); } 

您的問題沒有足夠的奇數約束,因此在ES6的幫助下,我們也可以不使用for循環。

 // Cf. Array.prototype.some const any = (f, [x,...xs]) => x === undefined ? false : f(x) || any(f,xs); // Return true if the first iterable is a prefix of the second. const isprefix = ([x,...xs], [y,...ys]) => x === undefined ? true : x == y && isprefix(xs,ys); // tails('abc') --> [['a','b','c'], ['b','c'], ['c']] const tails = ([x,...xs]) => x === undefined ? [] : [[x,...xs],...tails(xs)]; // If needle is empty, or is a prefix of any of tails(haystack), return true. const contains = (haystack, needle) => needle.length ? any(bale => isprefix(needle, bale), tails(haystack)) : true; const tests = [ ['aaafoobar', 'foo'], ['foo', 'foo'], ['fo', 'foo'], ['', 'f'], ['f', ''], ['', ''] ]; tests.forEach(test => console.log(JSON.stringify(test), contains(test[0], test[1]))); 

你可以這樣

 var substr = "test", masterstr = "test1", checksubstr = (ms,ss) => !!~ms.indexOf(ss); console.log(checksubstr(masterstr,substr)); 

暫無
暫無

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

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