LeetCode 每日 1 题:删除字符串两端相同字符后的最短长度

34 阅读2分钟

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

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

原题地址

给你一个只包含字符 '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<=1051 <= s.length <= 10^5
  • s 只包含字符 'a''b' 和 'c' 。

思路分析

  1. 采用双指针法来解决;
  2. 先考虑边界值情况,如果字符串 s 只有一个元素,则返回 1
  3. 然后定义首尾指针,start0ends.length - 1,然后以 首尾元素相等并且尾元素在首元素后 为循环截止条件来做循环;
  4. 在循环过程中,循环到最后相邻字符串相等,则返回 0,可以都消掉;
  5. 如果首指针的字符与下一个字符相等,则只移动首指针。如果尾指针的字符与上一个字符相等时,则只移动尾指针。其他情况则将首指针向后移,将尾指针向前移,然后进入下一次循环;
  6. 循环结束后,返回 end - start + 1

AC 代码

/**
 * @param {string} s
 * @return {number}
 */
var minimumLength = function(s) {
    if(s.length === 1) { 
        return 1 
    } 

    let start = 0
    let end = s.length - 1
    while(s[start] === s[end] && end > start) {
        if((end - start) === 1) { 
            return 0
        }
        if(s[start + 1] === s[start]) {
            start++
        } else if(s[end - 1] === s[end]) {
            end--
        } else {
            start++
            end--
        }
    }
    return end - start + 1
};

结果:

  • 执行结果: 通过
  • 执行用时:68 ms, 在所有 JavaScript 提交中击败了68.18%的用户
  • 内存消耗:45 MB, 在所有 JavaScript 提交中击败了50.00%的用户
  • 通过测试用例:100 / 100

END