单词拼合问题
给定一个单词序列,每行字符数有限。通过换行符使行清晰打印。
某些行有很多额外空格,某些行的额外空格较少时,这些行必须保持平衡,才能分隔各行。此算法会尽可能使用相同数量的额外空格使其保持平衡。
此算法会生成可以放置在一行中的单词数,以及需要的行数。
输入和输出
Input: The length of words for each line. {3, 2, 2, 5}. The max width is 6. Output: Line number 1: Word Number: 1 to 1 (only one word) Line number 2: Word Number: 2 to 3 (Second and 3rd word) Line number 3: Word Number: 4 to 4 (4th word)
算法
wordWrap(wordLenArr, size, maxWidth)
输入 − 单词长度数组、数组大小和单词的最大宽度。
输出 − 按行放置单词数的列表。
Begin define two square matrix extraSpace and lineCost of order (size + 1) define two array totalCost and solution of size (size + 1) for i := 1 to size, do extraSpace[i, i] := maxWidth – wordLenArr[i - 1] for j := i+1 to size, do extraSpace[i, j] := extraSpace[i, j-1] – wordLenArr[j - 1] - 1 done done for i := 1 to size, do for j := i+1 to size, do if extraSpace[i, j] < 0, then lineCost[i, j] = ∞ else if j = size and extraSpace[i, j] >= 0, then lineCost[i, j] := 0 else linCost[i, j] := extraSpace[i, j]^2 done done totalCost[0] := 0 for j := 1 to size, do totalCost[j] := ∞ for i := 1 to j, do if totalCost[i-1] ≠∞ and linCost[i, j] ≠ ∞ and (totalCost[i-1] + lineCost[i,j] < totalCost[j]), then totalCost[i – 1] := totalCost[i – 1] + lineCost[i, j] solution[j] := i done done display the solution matrix End
示例
#include<iostream> using namespace std; int dispSolution (int solution[], int size) { int k; if (solution[size] == 1) k = 1; else k = dispSolution (solution, solution[size]-1) + 1; cout << "Line number "<< k << ": Word Number: " <<solution[size]<<" to "<< size << endl; return k; } void wordWrap(int wordLenArr[], int size, int maxWidth) { int extraSpace[size+1][size+1]; int lineCost[size+1][size+1]; int totalCost[size+1]; int solution[size+1]; for(int i = 1; i<=size; i++) { //find extra space for all lines extraSpace[i][i] = maxWidth - wordLenArr[i-1]; for(int j = i+1; j<=size; j++) { //extra space when word i to j are in single line extraSpace[i][j] = extraSpace[i][j-1] - wordLenArr[j-1] - 1; } } for (int i = 1; i <= size; i++) { //find line cost for previously created extra spaces array for (int j = i; j <= size; j++) { if (extraSpace[i][j] < 0) lineCost[i][j] = INT_MAX; else if (j == size && extraSpace[i][j] >= 0) lineCost[i][j] = 0; else lineCost[i][j] = extraSpace[i][j]*extraSpace[i][j]; } } totalCost[0] = 0; for (int j = 1; j <= size; j++) { //find minimum cost for words totalCost[j] = INT_MAX; for (int i = 1; i <= j; i++) { if (totalCost[i-1] != INT_MAX && lineCost[i][j] != INT_MAX && (totalCost[i-1] + lineCost[i][j] < totalCost[j])){ totalCost[j] = totalCost[i-1] + lineCost[i][j]; solution[j] = i; } } } dispSolution(solution, size); } main() { int wordLenArr[] = {3, 2, 2, 5}; int n = 4; int maxWidth = 6; wordWrap (wordLenArr, n, maxWidth); }
输出
Line number 1: Word Number: 1 to 1 Line number 2: Word Number: 2 to 3 Line number 3: Word Number: 4 to 4
广告