Question
Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words.

For example, given
s = ​​​"leetcode"​​​,
dict = ​​​["leet", "code"]​​.

Return true because ​​"leetcode"​​​ can be segmented as ​​"leet code"​​.


本题难度Medium。有2种算法分别是: DFS(超时,不写)和DP

DP

【复杂度】
时间 O(N) 空间 O(N)

【思路】
设状态​​​f(i)​​​代表​​s[0,i]​​​能否被分词。那么只要能找到分界点​​j∈[0,i]​​​,保证​​f(j-1)==true​​​且​​s[j,i]​​​能被分词,则​​f(i)=true​​。

【附】
这里有个技巧可以避免对特殊情况​​​f(0)​​​的处理:数组​​f​​​设置个数为​​s.length()+1​​​,让​​f(0)=true​​​,这样​​f(i)​​​实际代表的是​​s[0,i-1]​​能否被分词。

【代码】

public class Solution {
public boolean wordBreak(String s, Set<String> wordDict) {
//require
if(s==null)return false;
int size=s.length();
if(size<1)return false;
boolean[] f=new boolean[size+1];
f[0]=true;
//invariant
for(int i=0;i<size;i++)
for(int j=0;j<=i;j++)
if(f[j]==true&&wordDict.contains(s.substring(j,i+1))){
f[i+1]=true;
break;
}
//ensure
return f[size];
}
}