【LeetCode】1190. 反转每对括号间的子串

218 阅读2分钟

反转每对括号间的子串

给出一个字符串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)
}