题目描述
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"
.
解题思路
动态规划:
将源字符串从开始到结尾,分解成各个子串进行操作,对于这类字符串组合问题,需要掌握其状态转移方程,即遍历子串划分为两部分来得到当前位置的状态。
具体参见代码。
代码
/**
* 判断s = "leetcode"是可以由dict = ["leet", "code"]中单词进行划分
* 动态规划求解
* @param s
* @param dict
* @return
*/
public boolean wordBreak(String s, Set<String> dict) {
int strLen = s.length();
boolean[] state = new boolean[strLen];
for (int i = 0; i < strLen; i++) {
state[i] = dict.contains(s.substring(0, i + 1));
if (!state[i]) {
for (int j = 0; j < i; j++) {
if (state[j]) {
//分为[0,j]和[j+1,i]两部分
state[i] = dict.contains(s.substring(j+1, i + 1));
if (state[i])
break;
}
}
}
}
return state[strLen - 1];
}