1. 程式人生 > 實用技巧 >leetcode 1593. 拆分字串使唯一子字串的數目最大(DFS,剪枝)

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;
    }
};