leetcode.1190反转每对括号间的子串

给出一个字符串 s(仅含有小写英文字母和括号)。

请你按照从括号内到外的顺序,逐层反转每对匹配括号中的字符串,并返回最终的结果。

注意,您的结果中 不应 包含任何括号。

示例 1:
输入:s = "(abcd)" 输出:"dcba"

示例 2:
输入:s = "(u(love)i)" 输出:"iloveu" 解释:先反转子字符串 "love" ,然后反转整个字符串。

示例 3:
输入:s = "(ed(et(oc))el)" 输出:"leetcode" 解释:先反转子字符串 "oc" ,接着反转 "etco" ,然后反转整个字符串。

  1. 匹配到左括号'(' 时把位置入栈,

  1. 匹配度右括号是')'时和栈顶的左括号匹配,确定需要反转子串的start和end索引

  1. 反转start和end之间的字符串

  1. 重步骤1、2、3,直到循环结束

public   String reverseParentheses(String s) {
        //使用栈匹配有效的括号
        Stack<Integer> stack = new Stack<>();
        //存储交换后的字符
        int[] cs = new int[s.length()];
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i)=='('){
                stack.add(i);
                continue;
            }else if (s.charAt(i)==')'){
                final Integer pop = stack.pop();
              cs =  swap(cs,pop+1,i);
                continue;
            }
            cs[i]=s.charAt(i);
        }

        //去掉原来括号占的位置
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < cs.length; i++) {
            if (cs[i]!=0){
                sb.append((char) cs[i]);
            }
        }
     return sb.toString();
    }
    //交换字符串
    private  int[] swap(int[] cs, int start, int end) {
          //只需遍历字符串长度的一半
        for (int j = 0; j <(end-start)/2; j++) {
            cs[j+start] =  cs[j+start]^cs[end-j-1];
            cs[end-j-1] =cs[j+start]^cs[end-j-1];
            cs[j+start] =cs[j+start]^cs[end-j-1];
        }
        return cs;
    }

时间复杂度:O(n)

空间复杂度:O(n)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值