Найдите общую подстроку длиной> 1 символа между двумя строками в JS - PullRequest
0 голосов
/ 14 июля 2020

Согласно заголовку, мне нужно найти общую подстроку между двумя строками, длина которой превышает 1 символ (поэтому одна строка длиной в один символ не считается).

Я пытаюсь сначала сравнить две строки и, если их символы совпадают, вернуть истину. Иначе, чтобы вернуть 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 ]

1 голос
/ 14 июля 2020

Это грубое, неоптимальное решение:

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)}"`);
}

Идея состоит в том, чтобы перебрать все пары смещений в пределах str1 и str2. В конце концов мы придем к смещениям, где встречается самая длинная последовательность общих символов.

Обратите внимание, что я предоставил minLen в качестве параметра. Вы можете установить его на 2, если хотите отбросить результаты длиной менее 2 символов.

0 голосов
/ 14 июля 2020
   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;
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...