1. 程式人生 > 其它 >leetcode 字串 單詞拆分 java

leetcode 字串 單詞拆分 java

題目描述
給定一個非空字串 s 和一個包含非空單詞的列表 wordDict,判定 s 是否可以被空格拆分為一個或多個在字典中出現的單詞。
說明
拆分時可以重複使用字典中的單詞。
你可以假設字典中沒有重複的單詞。
示例 :
輸入: s = “leetcode”, wordDict = [“leet”, “code”]
輸出: true
解釋: 返回 true 因為 “leetcode” 可以被拆分成 “leet code”。

方法:
初始化一個布林型的陣列dp,初始值為false,長度為n+1,n為字串長度。
初始化dp[0]=true 空字元可以被表示,如下:
在這裡插入圖片描述

遍歷字串的所有子串
遍歷開始索引 i,遍歷區間 [0,n):

遍歷結束索引 j,遍歷區間 [i,j):
若 dp[j]=True 且 s[j…i) 在 wordlist中:dp[i]=True
【比如 i = 2,j = 0,dp[0] = true 但 l 不在 wordlist中;
j = 1, dp[1]=false
i = 4 j = 0 dp[0] = true , s.substring(0,4)=leet 在 wordlist中
所以dp[4] = true
同理 當i = 8 j = 4時 dp[j] = dp[4] = true , s.substring(4,8) = code 在 wordlist中
所以dp[8] = true】
返回dp的最後一個值即為結果

程式碼:

class Solution {
    public boolean wordBreak(String s, List<String> wordDict) {
        Set wordDictSet = new HashSet(wordDict);
        boolean dp[] = new boolean[s.length()+1];
        dp[0] = true;
        for(int i = 0;i<=s.length();i++){
            for(int j = 0;j<i;j++){
                if
(dp[j] && wordDictSet.contains(s.substring(j,i))){ dp[i] = true; break; } } } return dp[s.length()]; } }