139.单词拆分
文章
思路
外层遍历字符串长度,内层遍历单词列表,当且仅当背包长度与单词长度之间差值对应部分恰好等于当前单词时为true
d
p
[
i
]
=
d
p
[
i
−
l
e
n
]
∧
m
a
t
c
h
(
s
.
s
u
n
s
t
r
(
i
−
l
e
n
,
l
e
n
)
,
w
o
r
d
)
dp[i]=dp[i-len] \land match(s.sunstr(i-len, len), word)
dp[i]=dp[i−len]∧match(s.sunstr(i−len,len),word)
代码
class Solution {
public boolean wordBreak(String s, List<String> wordDict) {
int i, j, n;
n = s.length();
boolean[] dp = new boolean[n + 1];
int shortest, longest;
int len;
dp[0] = true;
for (i = 1; i < n + 1; ++i) {
for (String word: wordDict) {
len = word.length();
if (i >= len && dp[i - len] && match(s, i - len, word)) {
dp[i] = true;
break;
}
}
}
return dp[n];
}
public boolean match(String s, int start, String pattern) {
int offset, len;
len = pattern.length();
if (s.length() - start < len) {
return false;
}
for (offset = 0; offset < len; ++offset) {
if (s.charAt(offset + start) != pattern.charAt(offset)) {
return false;
}
}
return true;
}
}
总结
先做题再看讲解
大差不差