leetcode 1593. 拆分字符串使唯一子字符串的数目最大(DFS,剪枝)
题目链接
leetcode 1593. 拆分字符串使唯一子字符串的数目最大
题意:
给你一个字符串 s ,请你拆分该字符串,并返回拆分后唯一子字符串的最大数目。
字符串 s 拆分后可以得到若干 非空子字符串 ,这些子字符串连接后应当能够还原为原字符串。但是拆分出来的每个子字符串都必须是 唯一的 。
注意:子字符串 是字符串中的一个连续字符序列。
思路:
DFS,一段一段的判断,利用unordered_set判重,不用unordered_map是为了方便剪枝
剪枝:
如果当前set.size()+剩下的未判断的字符串的长度< ans,则剪枝,除去这种情况
class Solution {
public:
int ans=1;
void dfs(string s,unordered_set<string> st,int cnt){
if(!s.size()){
ans=max(ans,cnt);
return ;
}
for(int i=0;i<s.size();i++){
string cur=s.substr(0,i+1);
if(st.size()+s.size() < ans) continue;
if(!st.count(cur)){//回溯的时候不要使用 ump.count() 因为key之前就有了
st.insert(cur);
dfs(s.substr(i+1),st,cnt+1);
// ump[cur]--;
st.erase(cur);
}
}
}
int maxUniqueSplit(string s) {
//直接用set
unordered_set<string> st;
dfs(s,st,0);
return ans;
}
};