题目描述
给你一个字符串 s
,你需要将它分割成一个或者更多的 平衡 子字符串。比方说,s == "ababcc"
那么 ("abab", "c", "c")
,("ab", "abc", "c")
和 ("ababcc")
都是合法分割,但是 ("a", "bab", "cc")
,("aba", "bc", "c")
和 ("ab", "abcc")
不是,不平衡的子字符串用粗体表示。
请你返回 s
最少 能分割成多少个平衡子字符串。
注意:一个 平衡 字符串指的是字符串中所有字符出现的次数都相同。
示例 1:
输入:s = "fabccddg"
输出:3
解释:
我们可以将 s
分割成 3 个子字符串:("fab, "ccdd", "g")
或者 ("fabc", "cd", "dg")
。
示例 2:
输入:s = "abababaccddb"
输出:2
解释:
我们可以将 s
分割成 2 个子字符串:("abab", "abaccddb")
。
提示:
1 <= s.length <= 1000
s
只包含小写英文字母。
AC代码
int mem[1005]; //记忆化存储
class Solution {
public:
int dfs(string s, int n) {
if (n < 0) return 0;
if (n == 1) return 1;
int& re = mem[n];
if (re != -1) return re;
re = INT_MAX;
int ha[26] = {0}, cnt = 0, m = 0;
for (int n1 = n; n1 >= 0; n1--) {
if (ha[s[n1] - 'a'] == 0) cnt++;
ha[s[n1] - 'a']++;
m = max(m, ha[s[n1] - 'a']);
if(n - n1 + 1 == m * cnt) {
re = min(re, dfs(s, n1 - 1) + 1);
}
}
return re;
}
int minimumSubstringsInPartition(string s) {
memset(mem, -1, sizeof(mem));
int n = s.length();
if (n == 1) return 1;
return dfs(s, n - 1);
}
};