第一题:反转每对括号间的子串(1190. 反转每对括号间的子串)
参考博客:Leetcode 1190:反转每对括号间的子串(超详细的解法!!!)
JAVA程序设计:反转每对括号间的子串(LeetCode:1190)
可以使用dfs,也可以使用栈来做,栈中存放字符串。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
System.out.println(reverseParentheses(str));
}
//思路:遇到左括号时递归进行字符串反转即可,不仅代码简洁,也能完美解决括号嵌套的问题
public static String reverseParentheses(String s) {
if(s.length()<=1) return s;
StringBuilder str=new StringBuilder();
for(int i=0;i<s.length();i++) {
if(s.charAt(i)=='(') {
int j=i,bal=0;
for(;j<s.length();j++) {
if(s.charAt(j)=='(') bal++;
if(s.charAt(j)==')') bal--;
if(bal==0) break;
}
StringBuilder tmp=new StringBuilder(reverseParentheses(s.substring(i+1, j)));
for(int k=tmp.length()-1;k>=0;k--)
str.append(tmp.charAt(k));
i=j;
}
else
str.append(s.charAt(i));
}
return str.toString();
}
}
用栈来做,极其容易理解,建议掌握
public String reverseParentheses(String s) {
StringBuilder sb = new StringBuilder();
char[] arr = s.toCharArray();
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < arr.length; i++) {
if (arr[i] == '(')
stack.push(i);
if (arr[i] == ')')
reverse(arr, stack.pop() + 1, i - 1);
}
for (int i = 0; i < arr.length; i++)
if (arr[i] != ')' && arr[i] != '(')
sb.append(arr[i]);
return sb.toString();
}
public void reverse(char[] arr, int left, int right) {
while (right > left) {
char tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
right--;
left++;
}
}
作者:uncleGem
链接:https://leetcode-cn.com/problems/reverse-substrings-between-each-pair-of-parentheses/solution/javati-jie-zhi-jie-kan-dai-ma-jiu-hui-liao-wu-xu-j/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。