Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务活动详情
一、题目描述
给定一个字符串和一个字典,按照字典将字符串添加空格,使得其每个单词都合法,返回所有的可行的划分。
数据范围
l <= 20
二、思路分析
由于数据很小,我们可以考虑暴搜,每次对剩下的串进行考虑,如果有某个前缀合法的话就继续递归处理剩下的串。
有个地方被自己坑了,string
的 API
很多都是会修改字符串自身的,一开始没注意到,导致递归后出来原来的信息被污染了,查了半天才发现是这个锅。
三、AC代码
class Solution {
public:
vector<string> ans;
map<string, int> mp;
void dfs(string now, string s){
if (s.length() == 0) {
ans.push_back(now);
return;
}
if (now.length()) {
now.push_back(' ');
}
int l = s.length();
for (int i=1; i<=l; i++) {
string pick = s.substr(0,i);
if (mp[pick]) {
string now2 = now;
now2.append(pick);
string s2 = s;
s2.erase(0,i);
dfs(now2, s2);
}
}
return;
}
vector<string> wordBreak(string s, vector<string>& wordDict) {
for (auto d:wordDict) {
mp[d] = 1;
}
string f;
dfs(f, s);
return ans;
}
};
四、总结
代码中善于利用 string
的 API
,比起之前自己经常写裸的char
数组好用多了,心智负担也降低了很多。