2207. 字符串中最多数目的子字符串(贪心)

270 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

每日刷题第72天 2021.03.25

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

题目描述

  • 给你一个下标从 0 开始的字符串 text 和另一个下标从 0 开始且长度为 2 的字符串 pattern ,两者都只包含小写英文字母。
  • 你可以在 text 中任意位置插入 一个 字符,这个插入的字符必须是 pattern[0] 或者 pattern[1] 。注意,这个字符可以插入在 text 开头或者结尾的位置。
  • 请你返回插入一个字符后,text 中最多包含多少个等于 pattern 的 子序列 。
  • 子序列 指的是将一个字符串删除若干个字符后(也可以不删除),剩余字符保持原本顺序得到的字符串。

解题思路

  • 子序列数量和 pattern 以外的字符无关,直接忽略
  • 相同子序列,即pattern本身
  • 对每个 pattern[1] 出现的位置,前面 pattern[0] 的数量就是能配对的数量
  • 前缀和直接统计每个 pattern[1],前面出现 pattern[0] 的数量
  • 最后添加 pattern 字符,假设在开头添加 pattern[0],此时增加的子序列数量恰好是 pattern[1] 的数量;在结尾添加 pattern[1] 同理
  • 因此直接统计text中的序列数,再加上 pattern 中出现次数更多的一方即可
  • 最优的情况下,肯定是 pattern[0] 插入到 text 开头或 pattern[1] 插入到 text 结尾。分别统计一下哪个子序列最多。
  • 注意:还需要特殊处理一下pattern[0] === pattern[1]的情况

AC代码

var maximumSubsequenceCount = function(text, pattern) {
  let len = text.length;
  let b = 0,a = 0,ans = 0;
  for(let i = len - 1; i >= 0; i--) {
    if(text[i] == pattern[0]){
      ans += b;
      a++;
    }
    if(text[i] == pattern[1]){
      b++;
    }
  }
  // console.log(ans)
  ans += a > b ? a : b;
  return ans;
};

总结

  • 贪心的思想,比较重要,一开始少考虑了几种情况,导致一直WA