You are given a 0-indexed string text
and another 0-indexed string pattern
of length 2
, both of which consist of only lowercase English letters.
You can add either pattern[0]
or pattern[1]
anywhere in text
exactly once. Note that the character can be added even at the beginning or at the end of text
.
Return the maximum number of times pattern
can occur as a subsequence of the modified text
.
A subsequence is a string that can be derived from another string by deleting some or no characters without changing the order of the remaining characters.
Example 1:
Input: text = "abdcdbc", pattern = "ac" Output: 4 Explanation: If we add pattern[0] = 'a' in between text[1] and text[2], we get "abadcdbc". Now, the number of times "ac" occurs as a subsequence is 4. Some other strings which have 4 subsequences "ac" after adding a character to text are "aabdcdbc" and "abdacdbc". However, strings such as "abdcadbc", "abdccdbc", and "abdcdbcc", although obtainable, have only 3 subsequences "ac" and are thus suboptimal. It can be shown that it is not possible to get more than 4 subsequences "ac" by adding only one character.
Example 2:
Input: text = "aabb", pattern = "ab" Output: 6 Explanation: Some of the strings which can be obtained from text and have 6 subsequences "ab" are "aaabb", "aaabb", and "aabbb".
Constraints:
1 <= text.length <= 105
pattern.length == 2
text
andpattern
consist only of lowercase English letters.
Similar Questions:
Step 1: count the number of subsequences in s
without insertion as sum
.
Step 2: At each index i
, let a
be the count of p[0]
in prefix, and b
be the count of p[1]
in the suffix.
If we append p[0]
, we get sum + b
subsequences. IF we append p[1]
, we get sum + a
subsequences.
// OJ: https://leetcode.com/problems/maximize-number-of-subsequences-in-a-string/
// Author: github.com/lzl124631x
// Time: O(N)
// Space: O(1)
class Solution {
public:
long long maximumSubsequenceCount(string s, string p) {
long a = 0, b = 0, sum = 0;
for (char c : s) b += c == p[1];
long tmp = b;
for (char c : s) {
tmp -= c == p[1];
if (c == p[0]) sum += tmp;
}
long ans = b;
for (char c : s) {
a += c == p[0];
b -= c == p[1];
ans = max({ ans, b, a });
}
return sum + ans;
}
};
In fact, we can see that, we just need the global maximum of all a
and b
values. This leads to solution 2.
If we add p[0]
, the best option is to prepend it at the beginning.
If we add p[1]
, the best option is to append it at the end.
// OJ: https://leetcode.com/problems/maximize-number-of-subsequences-in-a-string/
// Author: github.com/lzl124631x
// Time: O(N)
// Space: O(1)
class Solution {
public:
long long maximumSubsequenceCount(string s, string p) {
long a = 0, b = 0, sum = 0;
for (char c : s) {
if (c == p[1]) sum += a;
a += c == p[0];
b += c == p[1];
}
return sum + max(a, b);
}
};
https://leetcode.com/problems/maximize-number-of-subsequences-in-a-string/discuss/1863963