diff --git a/src/leecode/java/3333.找到初始输入字符串 II.java b/src/leecode/java/3333.找到初始输入字符串 II.java new file mode 100644 index 0000000..de687d4 --- /dev/null +++ b/src/leecode/java/3333.找到初始输入字符串 II.java @@ -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 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 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 + + */ +