Java 中不重叠子字符串的最大数量

13 2025年5月 | 阅读 3 分钟

给定一个字符串 s,任务是找到可以提取的不重叠子串的最大数量,同时确保每个选定的子串都包含其出现的所有字符的每一个实例。以字典顺序返回子串列表。

示例 1

输入: "abbaccd"

输出: ["bb", "cc", "d"]

解释: "bb" 和 "cc" 是自包含子串,而 "d" 单独出现,最大化数量。

示例 2

输入: "adefaddaccc"

输出: ["e", "f", "ccc"]

解释: "e" 和 "f" 是孤立的,而 "ccc" 是一个有效的子串,因为所有的 'c' 都包含在其中。

方法 1:贪心与区间合并法

该方法解决了查找最大数量不重叠子串的问题,同时确保每个子串都是自包含的。

算法

步骤 1: 找到字符串中每个字符的第一个和最后一个出现位置。

步骤 2: 扩展每个字符的区间,以包含其范围内的所有字符。

步骤 3: 根据结束索引对区间进行排序。

步骤 4: 贪心地选择最大数量的不重叠区间,以形成最终的子串。

输出

 
[bb, cc, d]   

复杂度

时间复杂度: 程序的 O(n)。因为需要扫描字符串、扩展区间和选择不重叠的区间。

空间复杂度: 程序的 O(1)。因为我们使用固定大小的数组(26 个字符)并存储最多 26 个区间。