删除字符串两端相同字符后的最短长度-LeetCode
1750. 删除字符串两端相同字符后的最短长度
🎯 问题描述(来源于LeetCode)
描述:
给你一个只包含字符 'a'、'b' 和 'c' 的字符串 s,你可以执行以下操作任意次:
- 选择字符串的一个非空前缀和一个非空后缀,要求前缀和后缀的所有字符都相同,且前缀和后缀的字符相同(即
s[0] == s[-1])。然后删除前缀和后缀,剩余部分拼接成新字符串。
求在执行任意次操作后,字符串可能的最短长度。
说明:
- 每次操作必须同时删除前缀和后缀,且前缀和后缀的字符必须相同。
- 如果两端字符不同,则无法继续操作,返回当前长度。
示例:
- 示例 1:
1 | 输入: s = "ca" |
- 示例 2:
1 | 输入: s = "cabaabac" |
- 示例 3:
1 | 输入: s = "aabccabba" |
💻 解题思路
思路:双指针删除相同字符块
算法步骤
- 初始化左指针
left = 0,右指针right = len(s) - 1。 - 当
left < right且s[left] == s[right]时:- 记录当前字符
ch = s[left]。 - 从左边删除所有与
ch相同的连续字符:while left <= right and s[left] == ch: left += 1。 - 从右边删除所有与
ch相同的连续字符:while left <= right and s[right] == ch: right -= 1。
- 记录当前字符
- 循环结束后,若
left > right,说明全部删除,返回 0;否则返回right - left + 1。
代码实现(您的代码)
1 | class Solution: |
📊 性能分析
- 时间复杂度:,每个字符最多被访问一次。
- 空间复杂度:,仅使用常数个变量。
思考
您的代码正确实现了题意:每次从两端删除所有与当前相同字符的连续块,并继续检查新的两端。注意内层两个 while 循环分别删除左右两侧的相同字符块,确保删除的是前缀和后缀中所有连续的该字符。最终若指针交错则返回 0,否则返回剩余长度。该解法是本题的标准双指针解法,高效且简洁。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 笺札!






