package com.interview.leetcode.dp;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
/**
* Created_By: stefanie
* Date: 14-11-25
* Time: 上午10:13
*/
public class MemoDP {
/**
* Given a word dict, and a sens, find the ways to segment given sens
* Memo: HashMap<substring, segment ways>
*/
static class WordBreak {
public static List<String> wordBreak(String s, Set<String> dict) {
HashMap<String, List<String>> memo = new HashMap<>();
int maxLen = maxLength(dict);
return wordBreak(s, dict, maxLen, memo);
}
public static List<String> wordBreak(String s, Set<String> dict, int maxLen, HashMap<String, List<String>> memo){
if(memo.containsKey(s)) return memo.get(s);
List<String> sols = 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()){
sols.add(word);
} else {
List<String> segments = wordBreak(s.substring(len, s.length()), dict, maxLen, memo);
for(String segment : segments) sols.add(word + " " + segment);
}
}
}
memo.put(s, sols);
return sols;
}
public static int maxLength(Set<String> dict) {
int length = 0;
for (String word : dict) length = Math.max(length, word.length());
return length;
}
}
}