我研究了 Heap 生成排列的演算法,以及所有類似問題的大量結果。
但他們似乎都想要輸入可以隨意調整的每一個排列。
我想要一個函式,它回傳所有可能的子字串,其中順序保持不變,因此對于輸入“abc”,結果不應包括“cba”。
這就是我的意思:
getAllSubstrings("abcdefg")應該回傳:
[
"a","b","c","d","e","f","g"
"ab","cd","ef", //"g"
"bc","de","fg", //"a"
"abc","def", //"g"
"bcd","efg", //"a"
"cde", //"fg", "ab"
"abcd", //"efg"
"bcde", //"a","fg"
"cdef", //"ab", "g"
"defg", //"abc"
"abcde", //"fg"
"bcdef", //"a""g"
"cdefg", //"ab"
"abcdefg"
]
使用Set丟棄重復值非常好。我只是無法理解您將如何實作上述目標。而且看起來很簡單……
有人對如何實作這一目標有任何好的想法嗎?
uj5u.com熱心網友回復:
以下是使用生成器的方法:
function* getAllSubstrings(s) {
for (let len = 1; len <= s.length; len ) {
for (let i = 0; i len <= s.length; i ) {
yield s.slice(i, i len);
}
}
}
console.log(Array.from(getAllSubstrings("abcedfg")));
或作為傳統功能:
function getAllSubstrings(s) {
const result = [];
for (let len = 1; len <= s.length; len ) {
for (let i = 0; i len <= s.length; i ) {
result.push(s.slice(i, i len));
}
}
return result;
}
console.log(getAllSubstrings("abcedfg"));
或以功能風格:
const getAllSubstrings = s =>
Array.from(s, (_, k) =>
Array.from(s.slice(k), (_, i) =>
s.slice(i, i k 1)
)
).flat();
console.log(getAllSubstrings("abcedfg"));
uj5u.com熱心網友回復:
一種略有不同的方法,結果集的順序不同。
function* getAllSubstrings(s) {
for (let i = 1; i < s.length; i ) yield s.slice(0, i);
if (s.length === 1) return;
yield* getAllSubstrings(s.slice(1));
}
console.log(Array.from(getAllSubstrings("abcedfg")));
.as-console-wrapper { max-height: 100% !important; top: 0; }
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/530015.html
