1021删除最外层的括号
GitHub 账户:LuvnJoae 欢迎关注! https://github.com/LuvnJoae
GitHub 代码链接:https://github.com/LuvnJoae/Java_leetcode
思路与结果
代码
思路1
package Day6_4_25.L1021;
public class Solution {
public String removeOuterParentheses(String S) {
// 变量count用于计数以分割,temp用于标记分割位置
int count = 0;
int temp = 0;
// 用可变字符串StringBuilder,把分割好的字符串添加进去。
StringBuilder sb = new StringBuilder();
// 转成字符数组,进行遍历
char[] chars = S.toCharArray();
for (int i = 0; i < chars.length; i++) {
// 进行识别计数,count=0代表着一次分割
if (chars[i] == '(') {
count++;
} else if (chars[i] == ')') {
count--;
}
// 先分割,再去头尾,最后添加到StringBuilder里
if (count == 0) {
String string = S.substring(temp, i + 1);
temp = i + 1;
sb.append(string.substring(1, string.length() - 1));
}
}
return sb.toString();
}
}
思路2
package Day6_4_25.L1021;
import java.util.Stack;
public class Solution2 {
public String removeOuterParentheses(String S) {
// 可变字符串、栈对象的创建、字符串转字符数组
StringBuilder sb = new StringBuilder();
Stack<Character> stack = new Stack<>();
char[] chars = S.toCharArray();
// 遍历
for (char c : chars) {
if (c == '('){
// 先检测是否为空,不是则添加字符,目的就是 去头尾。
if (!stack.empty()){
sb.append('c');
}
// 入栈 ( ,也只入栈这个,如果是 ),就代表需要出栈(抵消思路)
stack.push('(');
}else if (c == ')'){
// 不为空则代表栈顶有元素,即有 (,那么就出栈(抵消)
if (!stack.empty()) {
stack.pop();
}
// 出栈后再次判断,还不为空,则添加 ),为空代表着这是最后的),也就是分割点
if (!stack.empty()){
sb.append(')');
}
}
}
return sb.toString();
}
}
优化
对于第一种思路,可以通过count=1来判断是否需要将头尾添加到StringBuilder内。简化操作
class Solution {
public String removeOuterParentheses(String S) {
StringBuilder str = new StringBuilder("");
int flag = 0;
for(char c:S.toCharArray()){
//flag为0,代表着这是头,跳过去,不加进字符串内
if(flag == 0){
flag++;
}
else{
if(c == '('){
str.append(c);
flag++;
}
else if(c == ')'){
//flag>1,代表着这不是尾,可以加进字符串。
if(flag > 1){
str.append(c);
}
flag--;
}
}
}
return str.toString();
}
}