Почему при нахождении самого длинного общего префикса среди списка строк возникает ошибка выполнения? - PullRequest
0 голосов
/ 03 августа 2020

Вопрос:

Напишите функцию для поиска самой длинной общей строки префикса среди массива строк.

Если общего префикса нет, вернуть пустую строку "".

Мой код проходит тестовый пример, но когда я отправляю, я получаю сообщение об ошибке выполнения, в котором говорится, что firstWord не повторяется. Что я делаю не так?

let longestCommonPrefix = function(strs) {
  let result = '';
  let firstWord = strs[0];
  let index = 0;

  for (let letter of firstWord) {
    for (let i = 1; i < strs.length; i++) {
      let comparisonWord = strs[i];
      var comparisonLetter = comparisonWord[index];
      if (comparisonLetter !== letter) {
        return result;
      }
    }
    index++;
    result += comparisonLetter;
  }
  return result;
};

Ответы [ 3 ]

1 голос
/ 03 августа 2020

где длина strs равна 0, str [0] равно undefined, поэтому не повторять

var longestCommonPrefix = function(strs) {
  if(strs.length === 0) {
    return "";
  }

  let pre = "";
  let result = "";

  for (let i = 0; i < strs[0].length; i++) {
    pre = strs[0].slice(0, i+1)

    const filters = strs.filter(item => {
        return item.slice(0, i+1) === pre;
    });

    if (filters.length === strs.length) {
      result = pre;
    } else {
      return result;
    }
  }

  return result;
};
1 голос
/ 03 августа 2020

, если длина strs равна 0 , тогда не будет первого слова для итерации .

, если длина strs равна 1 , тогда результат будет единственной строкой, присутствующей в strs.

  var longestCommonPrefix = function(strs) {
        
      if(strs.length == 0)
          return "";
      
      if(strs.length == 1)
          return strs[0];
        
      let result = '';
      let firstWord = strs[0];
      let index = 0;
    
      for (let letter of firstWord) {
        for (let i = 1; i < strs.length; i++) {
          let comparisonWord = strs[i];
          var comparisonLetter = comparisonWord[index];
          if (comparisonLetter !== letter) {
            return result;
          }
        }
        index++;
        result += comparisonLetter;
      }
      return result;
    };
0 голосов
/ 03 августа 2020

Просто, чтобы упростить вещи, я сделал это функционально. Также может помочь явное преобразование в массив [...str].

function longestCommonPrefixOfPair(strA, strB) {
  if (strA.length === 0 || strB.length === 0) return '';
  if (strA.length > strB.length) return longestCommonPrefix(strB, strA);

  const pairs = toChars(strA).map((a, i) => [a, strB[i]]);
  const prefixLength = pairs.findIndex(([a, b]) => a !== b);
  return prefixLength >= 0 ? strA.slice(0, prefixLength) : strA;
}

function toChars(str) {
  return [...str];
}

const longestCommonPrefix = (strs) => strs.reduce(longestCommonPrefixOfPair);

console.log(["123456", "12345", "123456789", "123"].reduce(longestCommonPrefix)); // 123
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...