提问者:小点点

查找JS中两个字符串之间长度大于1个字符的公共子字符串


根据标题,我需要找到两个字符串之间的公共子字符串,它长于1个字符(所以一个字符长的不算)。

我尝试首先比较两个字符串,如果它们的字符匹配,则返回true。 否则返回false。 到目前为止,我得到了这个代码:

function SubstringTest(str1, str2){
 
   for ( let i = 0; i < str1.length; i++) {
     for (let j = 0; j < str2.length; j++) {
       
       if ((str1[i]) === (str2[j])) {
         
         return true
       } else {
         return false
       }
     }
   }
  }
SubstringTest("something", "home")

但我不明白为什么不起作用。 谁能告诉我正确的方向吗? 谢了。


共2个答案

匿名用户

这是一个残酷的,非最优的解决方案:

null

let commonSubstring = (str1, str2, minLen=1) => {
  
  let best = { len: 0, off1: null, off2: null };
  
  for (let off1 = 0; off1 < str1.length - minLen; off1++) {
    for (let off2 = 0; off2 < str2.length - minLen; off2++) {
      
      // Holds the number of characters that match
      let maxLen = Math.min(str1.length - off1, str2.length - off2);
      let len = 0;
      while (len < maxLen && str1[off1 + len] === str2[off2 + len]) len++;
      
      // Store this result if it's the best yet
      if (len > best.len) best = { len, off1, off2 };
      
    }
  }
  
  // We can now assert that str1.slice(best.off1, best.len) === str2.slice(best.off2, best.len)
  return best.len >= minLen ? str1.slice(best.off1, best.off1 + best.len) : null;
  
};

let tests = [
  [ 'mustard', 'hustler' ],
  [ 'lemon', 'harlem' ],
  [ 'marshmallow', 'hollow' ],
  [ 'marshmallow', 'marshal' ],
  [ 'jefferson', 'jeffery' ]
];

console.log('Examples:');
for (let [ str1, str2 ] of tests) {
  console.log(`Strings "${str1}" and "${str2}" share substring "${commonSubstring(str1, str2, 2)}"`);
}

匿名用户

   function SubstringTest(str1, str2){
       var matchingText = "";
       for ( let i = 0; i < str1.length; i++) {
            if(str1[i] == str2[i]){
                matchingText+= str1[i];
            }
       }

       if(matchingText.length > 0)
            return true;
        return false;
   }