July 31, 2019

140. Word Break II

140. Word Break II

Word Break 是经典 DP 题。而 Word Break II 要求所有组合,无法用 DP 解,要遍历解。backtracking + memorization.

class Solution {
    public List<String> wordBreak(String s, List<String> wordDict) {
        Set<String> wordSet = new HashSet<>(wordDict);
        HashMap<String, List<String>> used = new HashMap<>();
        return helper(s, wordSet, used);
    }
    
    private List<String> helper(String s, Set<String> wordSet, HashMap<String, List<String>> used) {
        if (used.containsKey(s)) {
            return used.get(s);
        }
        if (s.length() == 0) {
            return null;
        }
        List<String> res = new ArrayList<>();

        for (int i = 1; i <= s.length(); i++) {
            String subString = s.substring(0, i);
            List<String> partRes = null;
            if (wordSet.contains(subString)) {
                partRes = helper(s.substring(i), wordSet, used);
                if (partRes == null) {
                    res.add(subString);
                } else {
                    for (String str : partRes) {
                        res.add(subString + " " + str);
                    }
                }
            }
        }
        used.put(s, res);
        return res;
    }
}
comments powered by Disqus