繁体   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