列表

详情


2207. 字符串中最多数目的子字符串

给你一个下标从 0 开始的字符串 text 和另一个下标从 0 开始且长度为 2 的字符串 pattern ,两者都只包含小写英文字母。

你可以在 text 中任意位置插入 一个 字符,这个插入的字符必须是 pattern[0] 或者 pattern[1] 。注意,这个字符可以插入在 text 开头或者结尾的位置。

请你返回插入一个字符后,text 中最多包含多少个等于 pattern 的 子序列 。

子序列 指的是将一个字符串删除若干个字符后(也可以不删除),剩余字符保持原本顺序得到的字符串。

 

示例 1:

输入:text = "abdcdbc", pattern = "ac"
输出:4
解释:
如果我们在 text[1] 和 text[2] 之间添加 pattern[0] = 'a' ,那么我们得到 "abadcdbc" 。那么 "ac" 作为子序列出现 4 次。
其他得到 4 个 "ac" 子序列的方案还有 "aabdcdbc" 和 "abdacdbc" 。
但是,"abdcadbc" ,"abdccdbc" 和 "abdcdbcc" 这些字符串虽然是可行的插入方案,但是只出现了 3 次 "ac" 子序列,所以不是最优解。
可以证明插入一个字符后,无法得到超过 4 个 "ac" 子序列。

示例 2:

输入:text = "aabb", pattern = "ab"
输出:6
解释:
可以得到 6 个 "ab" 子序列的部分方案为 "aaabb" ,"aaabb" 和 "aabbb" 。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: long long maximumSubsequenceCount(string text, string pattern) { } };

rust 解法, 执行用时: 3 ms, 内存消耗: 2.4 MB, 提交时间: 2024-09-24 09:32:04

impl Solution {
    pub fn maximum_subsequence_count(text: String, pattern: String) -> i64 {
        let pattern = pattern.as_bytes();
        let x = pattern[0];
        let y = pattern[1];
        let mut ans = 0i64;
        let mut cnt_x = 0;
        let mut cnt_y = 0;
        for c in text.bytes() {
            if c == y {
                ans += cnt_x as i64;
                cnt_y += 1;
            }
            if c == x {
                cnt_x += 1;
            }
        }
        ans + cnt_x.max(cnt_y) as i64
    }
}

javascript 解法, 执行用时: 95 ms, 内存消耗: 58.3 MB, 提交时间: 2024-09-24 09:31:04

/**
 * @param {string} text
 * @param {string} pattern
 * @return {number}
 */
var maximumSubsequenceCount = function(text, pattern) {
    const [x, y] = pattern;
    let ans = 0, cntX = 0, cntY = 0;
    for (const c of text) {
        if (c === y) {
            ans += cntX;
            cntY++;
        }
        if (c === x) {
            cntX++;
        }
    }
    return ans + Math.max(cntX, cntY);
};

golang 解法, 执行用时: 16 ms, 内存消耗: 6.3 MB, 提交时间: 2024-09-24 09:30:39

func maximumSubsequenceCount(text, pattern string) (ans int64) {
    x, y := pattern[0], pattern[1]
    cntX, cntY := 0, 0
    for i := range text {
        c := text[i]
        if c == y {
            ans += int64(cntX)
            cntY++
        }
        if c == x {
            cntX++
        }
    }
    return ans + int64(max(cntX, cntY))
}

python3 解法, 执行用时: 132 ms, 内存消耗: 16.9 MB, 提交时间: 2024-09-24 09:30:08

class Solution:
    def maximumSubsequenceCount(self, text: str, pattern: str) -> int:
        x, y = pattern
        ans = cnt_x = cnt_y = 0
        for c in text:
            if c == y:
                ans += cnt_x
                cnt_y += 1
            if c == x:
                cnt_x += 1
        return ans + max(cnt_x, cnt_y)

cpp 解法, 执行用时: 36 ms, 内存消耗: 16.3 MB, 提交时间: 2023-07-12 09:40:58

class Solution {
public:
    long long maximumSubsequenceCount(string text, string pattern) {
        int cnt0 = 0;
        int cnt1 = 0;
        long long ans = 0;
        for (auto &ch : text) {
            if (ch == pattern[1]) {
                ans += cnt0;
                cnt1++;
            }
            if (ch == pattern[0]) {
                cnt0++;
            }
        }
        return ans + max(cnt0, cnt1);
    }
};

golang 解法, 执行用时: 12 ms, 内存消耗: 6.3 MB, 提交时间: 2023-07-12 09:40:29

func maximumSubsequenceCount(text, pattern string) (ans int64) {
	x, y := pattern[0], pattern[1]
	if x == y {
		c := int64(strings.Count(text, pattern[:1]))
		return c * (c + 1) / 2
	}
	cx, cy := 0, 0
	for i := range text {
		if ch := text[i]; ch == x {
			cx++
		} else if ch == y {
			cy++
			ans += int64(cx) // 每遇到一个 y,就累加左边 x 的个数
		}
	}
	return ans + int64(max(cx, cy))
}

func max(a, b int) int { if b > a { return b }; return a }

python3 解法, 执行用时: 148 ms, 内存消耗: 16.8 MB, 提交时间: 2023-07-12 09:39:43

# 贪心
class Solution:
    def maximumSubsequenceCount(self, text: str, pattern: str) -> int:
        if pattern[0] == pattern[1]:
            return (cnt := text.count(pattern[0])) * (cnt + 1) >> 1
        cnt1, cnt2, ans = text.count(pattern[0]), text.count(pattern[1]), 0
        if cnt1 < cnt2: ans = cnt2
        else: cnt2 += 1
        for c in text:
            if   c == pattern[0]: ans += cnt2
            elif c == pattern[1]: cnt2 -= 1       
        return ans

java 解法, 执行用时: 9 ms, 内存消耗: 43.4 MB, 提交时间: 2023-07-12 09:36:12

/**
 * 贪心思想
 * 若pattern="ac",那么认为在text的开始添加'a'或者在text的结尾添加'c'这两种情况能得到最大值。
 * 遍历字符串,并记录初始子序列数量sum,以及'a'和'c'的数量。
 * 在开始处添加'a',则子序列数量=初始子序列数量+'c'的数量。
 * 在结尾处添加'c',则子序列数量=初始子序列数量+'a'的数量。
 **/
class Solution {
    public long maximumSubsequenceCount(String text, String pattern) {
        char front = pattern.charAt(0), back = pattern.charAt(1);
        long sum = 0;
        int fcnt = 0, bcnt = 0;
        // 从后向前遍历,统计pattern[0]和pattenr[1]的数量以及初始子序列数量。
        for(int i = text.length() - 1; i >= 0; i--) {
            char c = text.charAt(i);
            if(c == front) {
                sum += bcnt;
                fcnt++;
            } 
            if(c == back){
                bcnt++;
            }
        }
        // 返回初始子序列数量+新增的子序列数量
        return sum + Math.max(bcnt, fcnt);
    }
}

上一题