反转每对括号间的子串
给出一个字符串s(仅含有小写英文字母和括号)。
请你按照从括号内到外的顺序,逐层反转每对匹配括号中的字符串,并返回最终的结果。
注意,您的结果中不应包含任何括号。
示例1
输入:s = "(abcd)"
输出:"dcba"
示例2
输入:s = "(u(love)i)"
输出:"iloveu"
示例3
输入:s = "(ed(et(oc))el)"
输出:"leetcode"
思路
- 根据题意,从括号内到外的顺序,逐层反转每对匹配括号中的字符串。对于括号类的题目,大多是采用栈的方法解决。同样,我也是使用了栈的思想。
- 这个题中的字符串只包含'('、')'和'a-z'这三类。首先定义个切片,针对三类数据分别进行处理:
- 当遇到'('时,直接放入切片。
- 当遇到'a-z'时,直接放入切片。
- 当遇到')'时,将在它之前的左括号'('右边的字符存入一个临时变量,该临时变量也就是当前括号组内的字符串进行反转后的字符串。此外,还需要将反转后的字符串,返回给上一层,就是将其拼接到上一层的末尾。
解法
func reverseParentheses(s string) string {
res:=[]byte{}
for i:=0;i<len(s);i++{
if s[i]=='('{ // 当遇到'('时,直接放入切片
res=append(res,s[i])
}else if s[i]>='a'&&s[i]<='z'{ // 当遇到'a-z'时,直接放入切片
res=append(res,s[i])
}else{ // 当遇到')'时,需要对字符串进行处理
temp:="" // 定义临时变量,存放当前层反转后的字符串
for i:=len(res)-1;i>=0;i--{ // 从后往前遍历,实现反转
if res[i]!='('{ // 存放当前层括号内的数据(也就是和当前右括号成对的左括号,两括号之间的数据)
temp=temp+string(res[i])
}else{ // 一旦遇到'(',当前层结束
break
}
}
cur:=len(res)-len(temp)-1 // 当前层左括号的索引
res=res[:cur] // 由于结果中不应包含任何括号,因此要去掉左括号,结果为当前层的末尾
for i:=0;i<len(temp);i++{
res=append(res,temp[i]) // 将当前层拼接到上一层的末尾
}
}
}
return string(res)
}