题目描述
思路分析
线性dp
f
[
i
]
:
s
f[i]:s
f[i]:s的
[
1
,
i
]
[1,i]
[1,i]能否被拆分
f
[
j
]
=
t
r
u
e
(
j
>
i
a
n
d
f
[
i
]
=
t
r
u
e
a
n
d
[
i
,
j
]
的
h
a
s
h
值
出
现
过
)
f[j]=true (j>i\ and\ f[i]=true\ and\ [i,j]的hash值出现过)
f[j]=true(j>i and f[i]=true and [i,j]的hash值出现过)
自己实现一个字符串
h
a
s
h
hash
hash
代码实现
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
typedef unsigned long long ULL;
const int P=131;
unordered_set<ULL> hash;
for(auto& word:wordDict){
ULL h=0;
for(auto c:word) h=h*P+c;
hash.insert(h);
}
int n=s.size();
vector<bool> f(n+1);
f[0]=true;
s=" "+s;
for(int i=0;i<n;i++){
if(f[i]){
ULL h=0;
for(int j=i+1;j<=n;j++){
h=h*P+s[j];
if(hash.count(h)) f[j]=true;
}
}
}
return f[n];
}
};