單詞拆分 I · Word Break

[抄題]:算法

給出一個字符串s和一個詞典,判斷字符串s是否能夠被空格切分紅一個或多個出如今字典中的單詞。數組

s = "lintcode"數據結構

dict = ["lint","code"]ide

返回 true 由於"lintcode"能夠被空格切分紅"lint code"spa

[思惟問題]:debug

看到字符串就怕:仍是要掌握通常規律code

[一句話思路]:blog

仍是看rU手冊456頁的解法吧字符串

前部完美切分+後部是單詞string

[輸入量]:空: 正常狀況:特大:特小:程序裏處理到的特殊狀況:異常狀況(不合法不合理的輸入):

[畫圖]:

"aaaaaaa" ["aaaa","aa"] false。f[2] = f["li"] f[0] f[所有]都是true

lin完美切分+t在詞典中

[一刷]:

  1.  布爾型can數組的長度是字符串長度+1,不是詞典數+1

[二刷]:

  1. i <= s.length() 表示最後一位邊界也要處理
  2. 取子串的方法是.substring()

[三刷]:

[四刷]:

[五刷]:

  [五分鐘肉眼debug的結果]:

[總結]:

爲了取出長度爲j的單詞,起點實際上是i - j

[複雜度]:Time complexity: O(n*l^2+m) Space complexity: O(n^2)

查詢字符串是否在詞典中也是n

N字符串長度

M單詞個數

L單詞平均長度

[英文數據結構或算法,爲何不用別的數據結構或算法]:

從右邊開始切割,待判斷單詞由短到長,割到最大單詞長度L尚未便可終止。

從左邊開始切割,待判斷單詞由長到短,複雜度過高。

hash map查詢單詞,長度L不可忽略時,複雜度是L, 可忽略時爲1

[其餘解法]:

[Follow Up]:

[LC給出的題目變變變]:

word break2

 [代碼風格] :

public class Solution {
    /*
     * @param s: A string
     * @param dict: A dictionary of words dict
     * @return: A boolean
     */
     //maxLength
     private int maxLength (Set<String> dict) {
         int max = 0;
         for (String word : dict) {
             max = Math.max(max, word.length());
         }
         return max;
     }
    public boolean wordBreak(String s, Set<String> dict) {
        //corner case
        if (s == null || dict == null) {
            return false;
        }
        //state
        //boolean can[] = new boolean[dict.size() + 1];
        boolean can[] = new boolean[s.length() + 1];
        int max_len = maxLength (dict);
        //initialization
        can[0] = true;
        //function
        for (int i = 1; i <= s.length(); i++) {
            can[i] = false;
            for (int j = 0; j <= i && j <= max_len; j++) {
                if (can[i - j] == false) {
                    continue;
                }
                
                String word = s.substring(i - j, i);
                if (dict.contains(word)) {
                    can[i] = true;
                    break;
                }
            }
        }
        //answer
        return can[s.length()];
    }
}
View Code
相關文章
相關標籤/搜索