Maximize Number of Subsequences in a String

theabbie

Abhishek Chaudhary

Posted on June 16, 2022

Maximize Number of Subsequences in a String

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 "ab*adcdbc". 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 "abdc
adbc", "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", "aa*abb", and "aabb*b".

Constraints:

  • 1 <= text.length <= 105
  • pattern.length == 2
  • text and pattern consist only of lowercase English letters.

SOLUTION:

class Solution:
    def countSub(self, a, b):
        m = len(a)
        n = len(b)
        dp = [[0 for i in range(n + 1)] for j in range(m + 1)]
        for i in range(n + 1):
            dp[0][i] = 0
        for i in range(m + 1):
            dp[i][0] = 1
        for i in range(1, m + 1):
            for j in range(1, n + 1):
                if a[i - 1] == b[j - 1]:
                    dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]
                else:
                    dp[i][j] = dp[i - 1][j]
        return dp[m][n]

    def maximumSubsequenceCount(self, text: str, pattern: str) -> int:
        n = len(text)
        mxsub = self.countSub(text, pattern)
        a = text.count(pattern[0])
        b = text.count(pattern[1])
        return mxsub + max(a, b)
        # pos = []
        # for i in range(n):
        #     if text[i] in pattern:
        #         pos.append(i)
        #         pos.append(i + 1)
        # for i in pos:
        #     for j in range(2):
        #         val = self.countSub(text[:i] + pattern[j] + text[i:], pattern)
        #         mxsub = max(mxsub, val)
        # return mxsub
Enter fullscreen mode Exit fullscreen mode
💖 💪 🙅 🚩
theabbie
Abhishek Chaudhary

Posted on June 16, 2022

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related

Balance a Binary Search Tree
leetcode Balance a Binary Search Tree

June 19, 2022

Implement Stack using Queues
leetcode Implement Stack using Queues

June 16, 2022

Sum of Digits in Base K
leetcode Sum of Digits in Base K

June 16, 2022

Permutation Sequence
leetcode Permutation Sequence

June 16, 2022