大家好,欢迎来到无限大的频道。
今日继续给大家带来力扣题解。
题目描述(中等):
字符串中最多数目的子序列
给你一个下标从 0 开始的字符串 text 和另一个下标从 0 开始且长度为 2 的字符串 pattern ,两者都只包含小写英文字母。
你可以在 text 中任意位置插入 一个 字符,这个插入的字符必须是 pattern[0] 或者 pattern[1] 。注意,这个字符可以插入在 text 开头或者结尾的位置。
请你返回插入一个字符后,text 中最多包含多少个等于 pattern 的 子序列 。
子序列 指的是将一个字符串删除若干个字符后(也可以不删除),剩余字符保持原本顺序得到的字符串。
题目分析:
-
给定一个字符串 text 和一个长度为 2 的字符串 pattern,你可以在 text 的任意位置插入一个字符(这个字符必须是 pattern[0] 或 pattern[1]),目的是使 text 中的 pattern 子序列数量最多。
-
子序列是指从字符串中删除若干字符(或不删除),其余字符保持原顺序。
解题思路:
-
计数:
-
遍历 text,统计 pattern[0] 和 pattern[1] 的出现次数。
-
count_combined 用于统计可以形成 pattern 子序列的数量。
-
每当遇到 pattern[1] 时,之前所有的 pattern[0] 都可以与之形成一pattern子序列,因此将 count_first 累加到 count_combined 中。
-
-
最大化子序列数量:
-
通过在 text 中插入一个 pattern[0],可以增加 count_second 个新的子序列。
-
通过在 text 中插入一个 pattern[1],可以增加 count_first 个新的子序列。
-
取两者中的最大值作为结果。
-
-
返回结果:
- 返回通过插入 pattern[0] 或 pattern[1] 后形成的最大子序列数量。
参考代码:
long long maximumSubsequenceCount(char* text, char* pattern) {
long long count_first = 0; // 记录 pattern[0] 出现的次数
long long count_second = 0; // 记录 pattern[1] 出现的次数
long long count_combined = 0; // 记录可以形成的 'pattern' 子序列的数量
// 遍历整个 text 字符串
for (int i = 0; text[i] != '\0'; i++) {
if (text[i] == pattern[1]) {
// 如果当前字符是 pattern[1],那么之前出现的所有 pattern[0] 都可以与之形成一个 pattern 子序列
count_combined += count_first;
count_second++; // 计数 pattern[1] 的出现次数
}
if (text[i] == pattern[0]) {
// 计数 pattern[0] 的出现次数
count_first++;
}
}
// 计算通过插入 pattern[0] 或 pattern[1] 可以得到的最大子序列数量
long long max_count = count_first + count_combined;
long long test_count = count_second + count_combined;
// 返回两者中的最大值
return max_count > test_count ? max_count : test_count;
}
复杂度分析:
-
时间复杂度: (O(n)),其中 (n) 是 text 的长度,因为我们只需遍历一次 text。
-
空间复杂度: (O(1)),因为我们只使用了固定数量的额外变量来存储计数器。