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

184 阅读2分钟

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

前言

从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!

一、题目描述

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

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

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

请你返回对字符串 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 <= 105
  • s 只包含字符 'a''b' 和 'c'

二、思路分析

这题消除前缀和后缀的关键要弄清楚,即前缀要和后缀相等,所以在while循环中,首先定义了一个字符型变量c,用来记录最开始左边的字符。

然后通过双指针,分别从左边和右边遍历,相同的话就一直遍历,直到两个指针所指向的字符不一样为止。

最后返回两个指针之间的距离作为结果。

三、AC代码

class Solution {
public:
    int minimumLength(string s) {
       int n=s.size(),low=0,high=n-1;
        while(low<high&& s[high] == s[low]){
            char c = s[low];
            while(s[low]==c&&low<=high){low++;}
            while(s[high]==c&&low<=high){ high--;}    
        }
        return high-low+1;
    }
};

提交排名

image.png

四、总结

多加练习,这种题目不是很难。