专业的编程技术博客社区

网站首页 > 博客文章 正文

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

baijin 2024-08-13 00:53:34 博客文章 6 ℃ 0 评论

题目

给你一个只包含字符 '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' 。

解题思路分析

1、内置函数;时间复杂度O(n),空间复杂度O(n)

func minimumLength(s string) int {
	for len(s) > 0 {
		if s[0] == s[len(s)-1] && len(s) != 1 {
			temp := string(s[0])
			s = strings.TrimLeft(s, temp)
			s = strings.TrimRight(s, temp)
		} else {
			break
		}
	}
	return len(s)
}

2、双指针;时间复杂度O(n),空间复杂度O(1)

func minimumLength(s string) int {
	left, right := 0, len(s)-1
	for left < right {
		if s[left] != s[right] {
			break
		}
		temp := s[left]
		for left <= right && s[left] == temp {
			left++
		}
		for left <= right && s[right] == temp {
			right--
		}
	}
	return right - left + 1
}

总结

Medium题目,题目比较简单,可以使用双指针,也可以使用内置函数

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表