1. 程式人生 > >LeetCode 418. Sentence Screen Fitting

LeetCode 418. Sentence Screen Fitting

暴力模擬會超時。因此必須一行行直接放,不能一個個word放。

這種方法很巧妙,把word整合成一個string,單詞間用空格分隔,最後也加一個空格。

用一個變數記錄當前已經在screen上放了多少個字元,記為count。因此 count%n 下一個要放的字元。

對於每一行,先假設cols個字元都能放上去,count += cols。下一個字元 s[count%n] 應當放在下一行。

但是,很可能當前行是沒法放滿cols的字元的。

如果下一個字元 s[count%n] = ‘ ’,我們應當在當前行多放一個空白字元,即 ++count。

如果下一個字元 s[count%n] != ‘ ’,說明可能有word被切斷了,這是不合法的。因此,我們得減少當前行的字元數量,直到 s[(count-1)%n] == ‘ ’。

最後的結果就是能放下的字元數count/n。

 

時間複雜度:O(rows * average word length)

空間複雜度:O(# of words * average word length),因為把所有字元拼接到了一起。

 

/*
count: how many characters of the reformatted sentence is on the screen
count % length of reformatted sentence: the starting position of the next row
Answer: count / length of reformatted sentence
*/ class Solution { public: int wordsTyping(vector<string>& sentence, int rows, int cols) { string s=""; for (auto x:sentence) s += x+' '; int count=0; int n=s.size(); for (int i=0;i<rows;++i){ count
+= cols; // s[count/n] should be the first char on the next row, we need to modify if (s[count%n]==' ') ++count; else{ while (count>0 && s[(count-1)%n]!=' ') --count; } } return count/n; } };

 

References:

https://www.youtube.com/watch?v=kSlZlmuMdgE

https://github.com/jzysheep/LeetCode/blob/master/418.%20Sentence%20Screen%20Fitting.cpp