拆分字符串使唯一子字符串的数目最大

时间:2020-09-20
本文章向大家介绍拆分字符串使唯一子字符串的数目最大,主要包括拆分字符串使唯一子字符串的数目最大使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

给你一个字符串 s ,请你拆分该字符串,并返回拆分后唯一子字符串的最大数目。

字符串 s 拆分后可以得到若干 非空子字符串 ,这些子字符串连接后应当能够还原为原字符串。但是拆分出来的每个子字符串都必须是 唯一的 。

注意:子字符串 是字符串中的一个连续字符序列。

示例 1:

输入:s = "ababccc"
输出:5
解释:一种最大拆分方法为 ['a', 'b', 'ab', 'c', 'cc'] 。像 ['a', 'b', 'a', 'b', 'c', 'cc'] 这样拆分不满足题目要求,因为其中的 'a' 和 'b' 都出现了不止一次。
示例 2:

输入:s = "aba"
输出:2
解释:一种最大拆分方法为 ['a', 'ba'] 。
示例 3:

输入:s = "aa"
输出:1
解释:无法进一步拆分字符串。
 

提示:

1 <= s.length <= 16

s 仅包含小写英文字母

class Solution {
public:
    int res = 0;
    unordered_set<string> us;
    void dfs(string& s,int pos){
    int size = s.size();
    if(size - pos +us.size()<= res)
    return;//剪枝叶,即剩下的全加上也不足最大值ans
    if(pos == size){
        res = max(res,(int)us.size());//这边一定要注意统一类型之后再比较,否则容易出现相应的错误
        return;
    }

    string temp;
    for(int i= pos ;i<size;++i){
        temp += s[i];
        if(us.find(temp) == us.end()){//哈希表中没有找到相应的字串
            us.insert(temp);
            dfs(s,i+1);
            us.erase(temp);
        }
        //如果发现哈希表中已经存在temp,则继续长度加一
    }
    }
    int maxUniqueSplit(string s) {//回溯,剪枝,哈希表
        dfs(s,0);//对于每一个位置,依次数1,2,...等长度,然后跳转到下一个位置进行遍历和回溯。
        return res;
    }
};

原文地址:https://www.cnblogs.com/zmachine/p/13701141.html