题目要求:
给你一个包含若干星号 * 的字符串 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可以执行上述操作
解题思路
第一种暴力解法,思路上可行,但是执行超时了,很显然有优化空间。
代码:
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)
}