Sentence Screen Fitting

题目地址:
https://leetcode.com/problems/sentence-screen-fitting/description/

题目:
Given a rows x cols screen and a sentence represented by a list of non-empty words, find how many times the given sentence can be fitted on the screen.
Note:
  1. A word cannot be split into two lines.
  2. The order of words in the sentence must remain unchanged.
  3. Two consecutive words in a line must be separated by a single space.
  4. Total words in the sentence won't exceed 100.
  5. Length of each word is greater than 0 and won't exceed 10.
  6. 1 ≤ rows, cols ≤ 20,000.
Example 1:
Input:
rows = 2, cols = 8, sentence = ["hello", "world"]

Output: 
1

Explanation:
hello---
world---

The character '-' signifies an empty space on the screen.
Example 2:
Input:
rows = 3, cols = 6, sentence = ["a", "bcd", "e"]

Output: 
2

Explanation:
a-bcd- 
e-a---
bcd-e-

The character '-' signifies an empty space on the screen.
Example 3:
Input:
rows = 4, cols = 5, sentence = ["I", "had", "apple", "pie"]

Output: 
1

Explanation:
I-had
apple
pie-I
had--

The character '-' signifies an empty space on the screen.
解题思路:
这道题比较直接的思路就是用几个指针来做操作,但是对于有些case会超时。

代码:
public class SentenceScreenFitting {

    public static void main(String[] args){
        SentenceScreenFitting sentenceScreenFitting = new SentenceScreenFitting();
//        String[] strs = {"hello", "world"};//        int rst = sentenceScreenFitting.wordsTyping(strs, 2, 8);//        System.out.println(rst);//        String[] strs2 = {"a", "bcd", "e"};//        int rst2 = sentenceScreenFitting.wordsTyping(strs2, 3, 6);//        System.out.println(rst2);        String[] strs3 = {"i", "had", "apple", "pie"};
        int rst3 = sentenceScreenFitting.wordsTyping(strs3, 4, 5);
        System.out.println(rst3);
    }

    private String[] strs;

    public int wordsTyping(String[] sentence, int rows, int cols) {
        if(sentence == null || sentence.length == 0){
            return 0;
        }
        strs = sentence;
        int rowIndex = 1;
        int lineLeft = cols;
        int strIndex = 0;
        int rst = 0;
        while(rowIndex <= rows){
            String s = getNextStr(strIndex);
            if((s.length() >= lineLeft && lineLeft != cols) || (lineLeft == cols && s.length() > lineLeft)){
                rowIndex++;
                lineLeft = cols;
            }
            else{
                lineLeft -= lineLeft == cols ? s.length() : (s.length() + 1);
                strIndex++;
                if(strIndex % strs.length == 0){
                    rst++;
                }
            }
        }
        return rst;
    }

    private String getNextStr(int i){
        int index = i % strs.length;
        return strs[index];
    }

}

An updated version:

public int wordsTyping(String[] sentence, int rows, int cols) {
    String s = String.join(" ", sentence) + " ";
    int start = 0, l = s.length();
    for (int i = 0; i < rows; i++) {
        start += cols;
        if (s.charAt(start % l) == ' ') {
            start++;
        } else {
            while (start > 0 && s.charAt((start-1) % l) != ' ') {
                start--;
            }
        }
    }

    return start / s.length();
}








Comments

Popular Posts