删除字符串两端相同字符后的最短长度

108 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第37天,点击查看活动详情

1750. 删除字符串两端相同字符后的最短长度 - 力扣(LeetCode)

给你一个只包含字符 'a''b'  和 'c'  的字符串  s ,你可以执行下面这个操作(5 个步骤)任意次:

  1. 选择字符串 s  一个 非空 的前缀,这个前缀的所有字符都相同。
  2. 选择字符串 s  一个 非空 的后缀,这个后缀的所有字符都相同。
  3. 前缀和后缀在字符串中任意位置都不能有交集。
  4. 前缀和后缀包含的所有字符都要相同。
  5. 同时删除前缀和后缀。

请你返回对字符串 s  执行上面操作任意次以后(可能 0 次),能得到的 最短长度 。

示例 1:

输入: s = "ca"
输出: 2
解释: 你没法删除任何一个字符,所以字符串长度仍然保持不变。

示例 2:

输入: s = "cabaabac"
输出: 0
解释: 最优操作序列为:

  • 选择前缀 "c" 和后缀 "c" 并删除它们,得到 s = "abaaba" 。
  • 选择前缀 "a" 和后缀 "a" 并删除它们,得到 s = "baab" 。
  • 选择前缀 "b" 和后缀 "b" 并删除它们,得到 s = "aa" 。
  • 选择前缀 "a" 和后缀 "a" 并删除它们,得到 s = "" 。

示例 3:

输入: s = "aabccabba"
输出: 3
解释: 最优操作序列为:

  • 选择前缀 "aa" 和后缀 "a" 并删除它们,得到 s = "bccabb" 。
  • 选择前缀 "b" 和后缀 "bb" 并删除它们,得到 s = "cca" 。

提示:

  • 1 <= s.length <= 10^5
  • s  只包含字符  'a''b'  和  'c' 。

思路

本题可以使用双指针求解,初始用ij分别指向s的首字符和尾字符,判断s[i]是否等于s[j],当s[i]===s[j],令c = s[i],判断s[i]是否等于c,如果相等,继续i++,直到c!==s[i],同样循环j,当s[j]===c时,j--,直到s[j]!==c,重复上述循环直到s[i]!==s[j]。当s[i]!==s[j]时,ij间的距离就是我们要求的距离。代码如下。

解题

/**
 * @param {string} s
 * @return {number}
 */
var minimumLength = function (s) {
  let i = 0;
  let j = s.length - 1;
  while (s[i] === s[j] && i < j) {
    const c = s[i];
    while (i <= j && s[i] === c) {
      i++;
    }
    while (i <= j && s[j] === c) {
      j--;
    }
  }
  return j - i + 1;
};