拆分字符串使唯一子字符串的数目最大
给你一个字符串 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; } };