我需要返回最长前缀的长度,该长度也是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
数组中排除重叠。
答案 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));
}
编辑: 您的最新代码无效,原因有两个:
您可能最终会includedList
为空,但是仍然尝试从中取出第一个元素。
您不会考虑重叠。对于输入aaa
,正确的结果是a
,因为前缀aa
与相应的后缀重叠。换句话说,结果不能超过输入长度的一半。