Java实现 LeetCode 140 单词拆分 II(二)

140. 单词拆分 II

给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。

说明:

分隔时可以重复使用字典中的单词。
你可以假设字典中没有重复的单词。
示例 1:

输入:
s = “catsanddog”
wordDict = [“cat”, “cats”, “and”, “sand”, “dog”]
输出:
[
“cats and dog”,
“cat sand dog”
]
示例 2:

输入:
s = “pineapplepenapple”
wordDict = [“apple”, “pen”, “applepen”, “pine”, “pineapple”]
输出:
[
“pine apple pen apple”,
“pineapple pen apple”,
“pine applepen apple”
]
解释: 注意你可以重复使用字典中的单词。
示例 3:

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

class Solution {
      private Map<String, List<String>> cache = new HashMap<>();

    public List<String> wordBreak(String s, List<String> wordDict) {
        return dfs(s, wordDict,0);
    }


    private List<String> dfs(String s, List<String> wordDict, int offset){

        if (offset == s.length()){
            List<String> res = new ArrayList<>();
            res.add("");
            return res;
        }
        
        if (cache.containsKey(s.substring(offset))){
           return cache.get(s.substring(offset));
        }

        List<String> res = new ArrayList<>();
        for (String word : wordDict){
            if (word.equals(s.substring(offset, Math.min(s.length(),offset + word.length())))){
                List<String> next = dfs(s, wordDict, offset + word.length());
                for (String str: next){
                    res.add((word + " "+ str).trim());
                }
            }
        }

        cache.put(s.substring(offset),res);
        return res;
    }
}
原文地址:https://www.cnblogs.com/a1439775520/p/13076138.html