簡體   English   中英

Javascript Array String Word Wrap Problem ---按順序排列字符串和給定數組長度

[英]Javascript Array String Word Wrap Problem --- Permutation of Strings in Order and A Given Array Length

我需要編寫一個 JS 函數,它接受 1.一個字符串數組和 2.一個新數組長度,並在新數組中返回每個可能的字符串分組(按順序)。

這將有助於解決一系列設計的文本自動換行問題。 這是一個重要的細節,因為我不需要集合的每一個排列,唯一正確的解決方案是按照正確的順序或順序,並且連接到同一數組元素的單詞將被一個空格分隔。 我一直在研究遞歸解決方案,但一直沒有運氣。

例如

everyPermutation([A,B,C,D,E], 4);

function everyPermutation(arr, length) {
...
}

會回來

[
  ['A B', 'C', 'D', 'E'],
  ['A', 'B C', 'D', 'E'],
  ['A', 'B', 'C D', 'E'],
  ['A', 'B', 'C', 'D E']
]

這是一個遞歸實現。 在遞歸的每個級別,您迭代第一個塊的可能性。 遞歸調用是為了產生刪除該塊的所有可能性,並且塊計數減少一:

 function partitions(arr, length) { if (length === arr.length) return [arr]; // shortcut if (length === 1) return [[arr.join(" ")]]; // base case let results = []; for (let firstlen = arr.length - length + 1; firstlen > 0; firstlen--) { let prefix = arr.slice(0, firstlen).join(" "); results.push(...partitions(arr.slice(firstlen), length - 1) .map(result => [prefix, ...result])); } return results; } // Example from question console.log(partitions(["A","B","C","D","E"], 4)); // Example from comments console.log(partitions(["A","B","C","D","E"], 3));

另一個實現,以我更喜歡的表達式而不是語句的風格編寫,可能如下所示:

 const slicedCombos = (n, xs) => n == xs.length ? [xs.map (x => [x])] : [... Array (xs .length)] .map ((_, n) => xs .slice (0, xs .length - n)) .flatMap ( pf => slicedCombos (n - 1, xs .slice (pf .length)) .map (perm => [pf, ...perm]) ) const partitions = (n, xs) => slicedCombos (n, xs) .map (xss => xss .map (xs => xs .join(' '))) console .log (partitions (4, ['A', 'B', 'C', 'D', 'E'])) console .log (partitions (3, ['A', 'B', 'C', 'D', 'E']))
 .as-console-wrapper {max-height: 100% !important; top: 0}

這將切片和切塊原始數組的問題與格式化輸出的問題分開。 前者似乎更可能是可重用的。

在實踐中,我可能會提取一個幫助函數來列出數組的前綴,同樣是因為我認為它可以重用。 那看起來像這樣:

const prefixes = (xs) =>
  [... Array (xs .length)] .map ((_, n) => xs .slice (0, n + 1))  

const slicedCombos = (n, xs) => 
  n == xs.length
    ?  [xs.map (x => [x])]
  : prefixes (xs) .reverse() .flatMap (
      pfx => slicedCombos (n - 1, xs .slice (pfx .length)) .map (perm => [pfx, ...perm])
    )

額外的reverse是按照描述對這些結果進行排序。 如果順序無關緊要,我們可以跳過它。

我沒有將主函數或可重用的輔助函數命名為“everyPermutation”,因為這有點誤導。 “排列”意味着不同的東西。 雖然我選擇了“分區”,但這有點太籠統了,一個更好的名字會很有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM