This commit is contained in:
kazusa 2025-08-15 17:12:49 +08:00
parent b86b207218
commit 93bf1f6a03
1 changed files with 81 additions and 0 deletions

View File

@ -0,0 +1,81 @@
/*
* @lc app=leetcode.cn id=3333 lang=java
* @lcpr version=30201
*
* [3333] 找到初始输入字符串 II
*/
// @lc code=start
import java.util.ArrayList;
import java.util.List;
class Solution {
public int possibleStringCount(String word, int k) {
// 将原字符串转为数组单字母连续出现的次数为数组中的元素遇到一个新字母结算一个数组元素[]{a:3,b:3,a:4} {3,3,4}
// k的最小值即为数组长度记为m即至少每个出现连续块的字母取一次
// k向上增加时即k-m个数需要被分配此为递归
List<Integer> wordArr = new ArrayList<>();
int i = 0;
int sum = 0;
char c = word.charAt(i);
while (i < word.length()) {
if (word.charAt(i) != c) {
wordArr.add(sum);
c = word.charAt(i);
sum = 0;
}
sum++;
i++;
}
// 最多再分配k - wordArr.size()
int result = 0;
for (int remain = 0; remain < word.length(); remain++) {
result += dfs(wordArr, 0, word.length() - wordArr.size());
}
return result % (10^9+7);
}
private int dfs(List<Integer> wordArr, int index, int remain) {
// 字母分配完毕
if (remain == 0) {
return 1;
}
// 不可再分配
if (index >= wordArr.size()) {
return 0;
}
int sum = 0;
for (int i = 0; i <= wordArr.get(index); i++) {
sum += dfs(wordArr, index + 1, remain - i);
}
return sum;
}
public static void main(String[] args) throws InterruptedException {
// No3333 no = new No3333();
// System.out.println(no.possibleStringCount("aaabbb", 3));
while (true) {
Thread.sleep(1000);
}
}
}
// @lc code=end
/*
// @lcpr case=start
// "aabbccdd"\n7\n
// @lcpr case=end
// @lcpr case=start
// "aabbccdd"\n8\n
// @lcpr case=end
// @lcpr case=start
// "aaabbb"\n3\n
// @lcpr case=end
*/