查找也是字符串后缀的最长前缀-Javascript

时间:2019-05-25 20:28:39

标签: javascript arrays string slice

Link to codewars challenge

我需要返回最长前缀的长度,该长度也是Javascript中字符串的后缀。

据我了解,"abcd"中的前缀为:

['a', 'ab', 'abc']

"abcd"中的后缀为:

[ 'bcd', 'cd', 'd' ]

因此,在这种情况下,最长前缀也是"abcd"后缀的长度为0,因为在"abcd"中没有前缀也是后缀。

到目前为止,我已经能够弄清楚如何将后缀放入数组中进行比较,而不是前缀。

function returnLongestPrefixAndSuffix(string) {

  let prefixes = [];
  let suffixes = [];

  for (let i = 0; i < string.length -1; i++) {
    prefixes.push(string.slice(i));
  }

  for (let i = 1; i < string.length; i++) {
    suffixes.push(string.slice(i));
  }

  return prefixes + " " + suffixes;

}

console.log(returnLongestPrefixAndSuffix("abcd"));

我没有掌握如何从字符串的开头开始,以及每次将一个较大的元素添加到数组时增加一个字符的概念,但不包括将包含最后一个元素的元素。

请尽可能遵循我当前的逻辑。

编辑:我的代码现在如下所示:

function solve(string) {

    let prefixes = [];
    let suffixes = [];
    let includedList = [];

    for (let i = 1; i < string.length; i++) {
      prefixes.push(string.slice(0, i));
    }

    for (let i = 1; i < string.length; i++) {
      suffixes.push(string.slice(-i));
    }

    console.log(prefixes);
    console.log(suffixes);

    for (let i = 0; i < prefixes.length; i++) {
        let element = prefixes[i];
        if (suffixes.includes(element) === true) {
            includedList.push(element);
        }
    }

    console.log(includedList);
    if (includedList.length === 0) {
        return 0;
    }
    else {
        let overlap = prefixes.filter(value => suffixes.includes(value));
        console.log(overlap);
        let longest = includedList.sort(function (a, b) { return b.length - a.length; })[0];
        return longest.length;
    }
}

console.log(solve("abcdabc"));

这通过了10049测试,但在代码战中没有通过163测试。我仍然不知道如何处理overlap变量或如何从includedList数组中排除重叠。

3 个答案:

答案 0 :(得分:2)

function solve(string) {

    for (let i = Math.floor(string.length / 2); i > 0; i--) {

        let prefix = string.slice(0, i);
        let suffix = string.slice(-i);

        if (prefix == suffix) {
            return i;
        }
    }
    return 0;
}

console.log(solve("abcdabc"));

要解决重叠问题,请像这样初始化for循环:

let i = Math.floor(string.length / 2)

这将在字符串的中点初始化for循环,以便您可以递减并比较前缀==后缀(从最长的开始)。

您可以返回prefix.length,但这与i相同。

此外,请确保将return 0置于for循环之外。因为如果您尝试:

if (prefix != suffix) {
    return 0;
   }
在for循环内,

会在那里停止计数。

答案 1 :(得分:1)

要获取前缀,可以使用.slice的第二个参数:

  string.slice(0, i)

请注意,要获取后缀,还可以从结尾处获取字符串:

  string.slice(-i)

在数组中收集前缀和后缀是没有意义的,仅搜索后缀等于前缀的最大i。

答案 2 :(得分:1)

请参阅slice函数的文档,它可能需要第二个参数:https://www.w3schools.com/jsref/jsref_slice_string.asp

因此,按照您的逻辑,获取前缀的一种方法是:

for (let i = 1; i <= string.length; i++) {
  prefixes.push(string.slice(0, i));
}

编辑: 您的最新代码无效,原因有两个:

  1. 您可能最终会includedList为空,但是仍然尝试从中取出第一个元素。

  2. 您不会考虑重叠。对于输入aaa,正确的结果是a,因为前缀aa与相应的后缀重叠。换句话说,结果不能超过输入长度的一半。