算法刷题手记(1)
描述
你将得到一个由小写字母
a-z
,左括号'('
和右括号')'
构成的字符串s
。
你的任务是删除尽可能少的括号,使得s
里面的括号匹配。
你需要返回删除括号后的字符串。
由于答案可能会有很多,所以你只需要返回任意一个正确答案。如果答案正确会提示It is a correct answer.
例如:
"()"
,"(())"
,"()()"
,"(())()"
是括号匹配的字符串, 而")("
,"(()"
,"()()("
,"()())"
则是括号不匹配的字符串。
1 public String removeParentheses(String s) { 2 // write your code here. 3 /** 4 * 创建一个栈用于存放‘(’的索引 5 */ 6 Stack<Integer> locations = new Stack<>(); 7 8 /** 9 * 将待处理字符串转换为char数组 10 */ 11 char[] chars = s.toCharArray(); 12 for (int i = 0; i < chars.length; i++) { 13 /** 14 * 遍历字符数组,如果为‘(’,入栈 15 */ 16 if (chars[i] == '(') { 17 locations.push(i); 18 } 19 /** 20 * 遍历字符数组,如果为‘)’,且栈不为空( 即‘)’前面有‘(’->合理->出栈‘(’ ); 21 * 如果栈为空,即‘)’前面没有有‘(’->不合理->将当前‘)’位置变成‘*’ 注:‘*’在最后转为字符串被忽略,一个标记而已。 22 */ 23 if (chars[i] == ')') { 24 if (locations.isEmpty()) { 25 chars[i] = '*'; 26 } else { 27 locations.pop(); 28 } 29 30 } 31 } 32 33 /** 34 * 判断遍历结束 栈是否为空,如果为空说明'(' 够用,即使有多余的')',也在遍历时候变成了‘*’; 35 * 如果不为空,则栈中剩余的就是多余的'(' 的位置,遍历将所有多余位置变为‘*’ 36 */ 37 while (!locations.isEmpty()) { 38 Integer integer = locations.pop(); 39 chars[integer] = '*'; 40 } 41 /** 42 * 通过StringBuilder将char字符数组中的字符拼接起来(排除掉'*'),得到的就是符合条件的字符串 43 */ 44 StringBuilder sb = new StringBuilder(); 45 for (int i = 0; i < chars.length; i++) { 46 if (chars[i] == '*') { 47 continue; 48 } 49 String c = String.valueOf(chars[i]); 50 sb.append(c); 51 } 52 53 return sb.toString(); 54 }
感悟:最重要的两点:栈 和 匹配