leetcode-2390. 从字符串中移除星号

87 阅读2分钟

题目要求:

给你一个包含若干星号 * 的字符串 s 。
在一步操作中,你可以:

  • 选中 s 中的一个星号。
  • 移除星号 左侧 最近的那个 非星号 字符,并移除该星号自身。

返回移除 所有 星号之后的字符串

注意:

  • 生成的输入保证总是可以执行题面中描述的操作。
  • 可以证明结果字符串是唯一的。

示例 1:
输入: s = "leet**cod*e"
输出: "lecoe"
解释: 从左到右执行移除操作:

  • 距离第 1 个星号最近的字符是 "leet**code" 中的 't' ,s 变为 "leecod*e" 。
  • 距离第 2 个星号最近的字符是 "leecode" 中的 'e' ,s 变为 "lecod*e" 。
  • 距离第 3 个星号最近的字符是 "lecod*e" 中的 'd' ,s 变为 "lecoe" 。 不存在其他星号,返回 "lecoe" 。

示例 2:
输入: s = "erase*****"
输出: ""
解释: 整个字符串都会被移除,所以返回空字符串。

提示
1 <= s.length <= 105
s 由小写英文字母和星号 * 组成
s 可以执行上述操作

链接leetcode.cn/problems/re…

解题思路

第一种暴力解法,思路上可行,但是执行超时了,很显然有优化空间。

代码

func removeStars(s string) string {
	// 栈处理
	// 定义一个栈,遇到*就出栈
	stringSlice := make([]string, 0)
	for _, v := range s {
		if v != '*' {
			stringSlice = append(stringSlice, string(v))
		} else {
			stringSlice = stringSlice[:len(stringSlice)-1]
		}
	}
	s = ""
	for _, v := range stringSlice {
		s += v
	}
	return s
}

第二种:优化rune和string之间的转化,不需要过多遍历,优化执行效率,这次通过测试。看了题解,大部分都是这种思路,这题我第一次失败在byte和string的转化上,我使用了遍历转换每个字符的格式在进行拼接,显然效率太低,可以直接使用string([]byte)实现字符串的拼接。

代码

func removeStars(s string) string {
	// 栈处理
	// 定义一个栈,遇到*就出栈
	stringSlice := make([]rune, 0)
	for _, v := range s {
		if v != '*' {
			stringSlice = append(stringSlice, v)
		} else {
			stringSlice = stringSlice[:len(stringSlice)-1]
		}
	}
	return string(stringSlice)
}