# 0139. Word Break
###### tags: `Leetcode` `Medium` `Dynamic Programming` `BFS`
Link: https://leetcode.com/problems/word-break/
## 思路
### 思路一 $O(N^3)$
动态规划
**注意List可以直接转换成Set的写法
以及substring的用法 substring(start,end)是取s[start]到s[end-1]**
### 思路二 $O(N^3)$
BFS/DFS+memo
时间复杂度分析:因为对于每一个位置,都要把后面的所有位置全部找一遍,找的过程中,产生substring $O(N)$
## Code
### 思路一
```java=
class Solution {
public boolean wordBreak(String s, List<String> wordDict) {
Set<String> wordDictSet = new HashSet<>(wordDict);
boolean[] dp = new boolean[s.length()+1];
dp[0] = true;
for(int i = 1; i <= s.length();i++){
for(int j = 0;j < i;j++){
dp[i] = dp[j]&&wordDictSet.contains(s.substring(j,i));
if(dp[i]) break;
}
}
return dp[s.length()];
}
}
```
### 思路二 dfs+memo
```python=
class Solution:
def wordBreak(self, s: str, wordDict: List[str]) -> bool:
visited = [False]*len(s)
def dfs(start):
if start == len(s): return True
if visited[start]: return False
visited[start] = True
for word in wordDict:
if s[start:].startswith(word):
if dfs(start+len(word)):
return True
return False
return dfs(0)
```
```java=
class Solution {
public boolean wordBreak(String s, List<String> wordDict) {
int len = s.length();
boolean[] visited = new boolean[s.length()];
return dfs(s, wordDict, visited, len);
}
private boolean dfs(String s, List<String> wordDict, boolean[] visited, int len){
if(s.length()==0) return true;
if(visited[len-s.length()]) return false;
for(String word:wordDict){
if(s.startsWith(word)){
if(dfs(s.substring(word.length()), wordDict, visited, len)) return true;
}
}
visited[len-s.length()] = true;
return false;
}
}
```
### 思路三 bfs+memo
```java=
class Solution {
public boolean wordBreak(String s, List<String> wordDict) {
Queue<Integer> q = new LinkedList<Integer>();
Set<String> dict = new HashSet<String>(wordDict);
boolean[] visited = new boolean[s.length()];
q.add(0);
while(!q.isEmpty()){
int start = q.poll();
if(visited[start]) continue;
for(int end = start+1;end <= s.length();end++){
if(dict.contains(s.substring(start,end))){
q.add(end);
if(end == s.length()){
return true;
}
}
}
visited[start] = true;
}
return false;
}
}
```