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;
    }
};
posted @ 2020-11-22 17:31  xzhws  阅读(128)  评论(0编辑  收藏  举报