Problems: https://leetcode.com/problems/word-break/
Solution1
Brute force: check all possible substrings
class Solution {
public boolean wordBreak(String s, List<String> wordDict) {
return word_break(s, wordDict, 0);
}
public boolean word_break(String s, List<String> wordDict, int start) {
if (start == s.length()) {
return true;
}
// Check all possible substrings and do recursion
for(int end = start + 1; end <= s.length(); end++) {
if (wordDict.contains(s.substring(start, end)) && word_break(s, wordDict, end)) {
return true;
}
}
return false;
}
}
Solution2:
Using map - dfs
class Solution {
public boolean wordBreak(String s, List<String> wordDict) {
return word_break(s, wordDict);
}
public boolean word_break(String s, List<String> dict) {
HashMap<String, Boolean> map = new HashMap<>();
if(s.equals("")) {
return true;
}
if (map.containsKey(s)) {
return map.get(s);
}
// 将已经检查过的string放入map中
for(int i = 1; i <= s.length(); i++) {
if(dict.contains(s.substring(0,i)) && word_break(s.substring(i), dict)) {
// 若通过则可判断substring为true
map.put(s.substring(i), true);
return true;
}
}
// 若无法通过,则传入的参数s为false
map.put(s, false);
return false;
}
}
Reference: https://www.youtube.com/watch?v=hLQYQ4zj0qg
Solution3:
Using dp
class Solution {
public boolean wordBreak(String s, List<String> wordDict) {
boolean[] dp = new boolean[s.length() + 1];
dp[0] = true;
for(int len = 1; len <= s.length(); len++) {
for(int i = 0; i < len; i++) {
if(wordDict.contains(s.substring(i,len)) && dp[i] == true) {
dp[len] = true;
break;
}
}
}
return dp[s.length()];
}
}
DP Analysis: https://www.youtube.com/watch?v=WepWFGxiwRs
Reference: https://www.youtube.com/watch?v=hLQYQ4zj0qg