Leetcode-139:单词拆分

题目描述:

给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。

说明:
拆分时可以重复使用字典中的单词。
你可以假设字典中没有重复的单词。

示例 1:

输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。

示例2:

输入: s = "applepenapple", wordDict = ["apple", "pen"]
输出: true
解释: 返回 true 因为 "applepenapple" 可以被拆分成 "apple pen apple"。
注意你可以重复使用字典中的单词。

示例3:

输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
输出: false

思路1:动态规划
声明一个长度为 str.length()+1的boolean数组。 dp[i]表示 str[0 - > i-1] 能否被拆分。
则计算dp[i]的时候,我们已经知道dp[0] -----dp[i-1]。
所以状态转移方程为:dp[ i ] = dp[ j ] && ( S[ j , i ]是否在dict中 )

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

思路2:递归法

class Solution {
    Map map = new HashMap();
    public boolean wordBreak(String s, List wordDict) {
        Set set = new HashSet<>();
        for(String str:wordDict){
            set.add(str);
        }
        set.add("");
        
        return wordBreak( s, set);
    }
    public boolean wordBreak(String s, Set set){
        if(map.containsKey(s)) return map.get(s);
        if(set.contains(s)){
            map.put(s,true);
            return true;
        }
        for(int i=0;i

你可能感兴趣的:(Leetcode-139:单词拆分)