题目大意:
反转每对括号间的子串
给出一个字符串 s(仅含有小写英文字母和括号)。
请你按照从括号内到外的顺序,逐层反转每对匹配括号中的字符串,并返回最终的结果。
注意,您的结果中 不应 包含任何括号。
示例 1:
输入:s = "(abcd)" 输出:"dcba"
示例 2:
输入:s = "(u(love)i)" 输出:"iloveu"
示例 3:
输入:s = "(ed(et(oc))el)" 输出:"leetcode"
示例 4:
输入:s = "a(bcdefghijkl(mno)p)q" 输出:"apmnolkjihgfedcbq"
提示:
0 <= s.length <= 2000
s
中只有小写英文字母和括号- 我们确保所有括号都是成对出现的
如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=1190
解题思路分析:
原字符串包含多层括号嵌套,翻转顺序由内至外,很容易想到使用递归思路来解题。当我们看到正括号时,说明需要进入下一层的嵌套,这时将问题扔给递归子问题去解决。当遇到反括号时,说明本层嵌套结束,此时应该结束当前递归返回递归函数上一层。如果遇到的是小写字母,我们就将其按顺序拼接起来,在本层递归结束时反转后返回给上一层即可。因此每一层的递归函数大概是下面这样:
String helper(){ String result = "小写字母" + "(" + "递归函数返回结果helper()" +")" + "小写字母"; result.reverse(); return result; }
当递归结束时,所有的字符都会按条件反转,注意的是,最外层如果没有括号,那么最外层是不需要反转的。另外,这个结果中包含括号字符,应该在最后将其全部删除。
看下实现代码:
public String reverseParentheses(String s) { // 先递归反转所有字符 String temp= helper(s, 0, 0).toString(); // 删除所有括号字符 StringBuilder sb = new StringBuilder(); for(int i=0;i<temp.length();i++){ if(temp.charAt(i)!=')' && temp.charAt(i)!='('){ sb.append(temp.charAt(i)); } } return sb.toString(); } // 递归函数 // s为原字符串 // index为字符当前的下标 // level为括号嵌套深度,默认0为最外层无括号 public StringBuilder helper(String s, int index, int level){ StringBuilder sb = new StringBuilder(); // 返回结果 for(int i=index;i<s.length();i++){ // 从index开始遍历字符串 char c = s.charAt(i); // 当前字符 if(c == '('){ // 如果为正括号,说明出现嵌套 // 递归得到嵌套括号内的反转字符串 StringBuilder child = helper(s, i+1, level+1); // 返回值加上正括号以及嵌套括号内的反转字符串 sb.append("(").append(child); // 嵌套内容已经遍历过,因此当前下标跳到嵌套子字符串之后 i+=(child.length()); }else if(c == ')'){ // 如果为反括号,说明嵌套结束 // 如果为最外层,没有上层可以返回,需要继续向后循环到结束 if(level==0){ continue; } // 返回结果加上反括号后,反转并返回给上层递归 return sb.append(")").reverse(); }else{ // 小写字母直接加到返回值中 sb.append(c); } } return sb; }
本解法运行时间为1ms。
Runtime: 1 ms, faster than 98.09% of Java online submissions for Reverse Substrings Between Each Pair of Parentheses.
Memory Usage: 34.8 MB, less than 100.00% of Java online submissions for Reverse Substrings Between Each Pair of Parentheses.
本网站文章均为原创内容,并可随意转载,但请标明本文链接如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: http://leetcode.jp/leetcode-1190-reverse-substrings-between-each-pair-of-parentheses-解题思路分析/