package com.interview.books.leetcodeoj; import java.util.*; /** * Created_By: stefanie * Date: 14-12-27 * Time: 下午5:01 */ public class LOJ140_WordBreakII { //backtracing to get all break solution, using memo to avoid duplication segmentation //generate segments for s, by partition it into word, // 1. if word is the end of s // 2. if word is not end of s, get segments of rest, for each rest add word in front of it as a solution //put in memo before return. public List<String> wordBreak(String s, Set<String> dict) { if(s == null || s.length() == 0) return new ArrayList(); int maxLen = getMaxLength(dict); Map<String, List<String>> memo = new HashMap(); return wordBreak(s, maxLen, dict, memo); } public List<String> wordBreak(String s, int maxLen, Set<String> dict, Map<String, List<String>> memo){ if(memo.containsKey(s)) return memo.get(s); List<String> segments = new ArrayList(); for(int len = 1; len <= maxLen && len <= s.length(); len++){ String word = s.substring(0, len); if(dict.contains(word)){ if(len == s.length()){ segments.add(word); } else { List<String> rests = wordBreak(s.substring(len), maxLen, dict, memo); for(String rest : rests) segments.add(word + " " + rest); } } } memo.put(s, segments); return segments; } private int getMaxLength(Set<String> dict){ int max = 0; for(String word : dict) max = Math.max(max, word.length()); return max; } }