package com.leetcode.easy;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
/**
* 〈1021. 删除最外层的括号〉
* 有效括号字符串为空 ("")、"(" + A + ")" 或 A + B,其中 A 和 B 都是有效的括号字符串,+ 代表字符串的连接。例如,"","()","(())()" 和 "(()(()))" 都是有效的括号字符串。
*
* 如果有效字符串 S 非空,且不存在将其拆分为 S = A+B 的方法,我们称其为原语(primitive),其中 A 和 B 都是非空有效括号字符串。
*
* 给出一个非空有效字符串 S,考虑将其进行原语化分解,使得:S = P_1 + P_2 + ... + P_k,其中 P_i 是有效括号字符串原语。
*示例 1:
* 对 S 进行原语化分解,删除分解中每个原语字符串的最外层括号,返回 S 。
* 输入:"(()())(())"
* 输出:"()()()"
* 解释:
* 输入字符串为 "(()())(())",原语化分解得到 "(()())" + "(())",
* 删除每个部分中的最外层括号后得到 "()()" + "()" = "()()()"。
* @author PitterWang
* @create 2020/5/10
* @since 1.0.0
*/
public class RemoveOuterParentheses {
public static void main(String[] args) {
String s = "()()";
System.out.println(removeOuterParentheses(s));
}
/***
* 使用字符串拼接实现
* @param s
* @return
*/
public static String removeOuterParentheses(String s) {
List list = new ArrayList();
int z = 0;
int y = 0;
for(int i = 0;i<s.length();i++){
char c = s.charAt(i);
if(c == '('){
z ++;
}else if(c == ')'){
y ++;
}
if(z == y){
list.add(i);
}
}
StringBuilder back = new StringBuilder();
for (int i = 0;i<list.size();i++) {
int be = 0;
if(i != 0){
be = (Integer)list.get(i - 1) + 1;
}
int end = (Integer)list.get(i) + 1;
String ss = s.substring(be,end);
back.append(ss.substring(1,ss.length()-1));
}
return back.toString();
}
/***
* 栈的实现
* @param s
* @return
*/
public static String removeOuterParenthesesNew(String s) {
StringBuilder back = new StringBuilder();
Stack<Character> stack = new Stack<>();
int be = 0;
int end = 0;
boolean flag = false;
for (int i = 0;i < s.length();i++) {
char ch = s.charAt(i);
if (ch == '(') {
stack.push(ch);
if (!flag) {
be = i;
flag = true;
}
}
if (ch == ')') {
stack.pop();
if (stack.isEmpty()) {
end = i;
back.append(s.substring(be + 1,end));
flag = false;
be = end;
}
}
}
return back.toString();
}
}
1021. 删除最外层的括号
最新推荐文章于 2022-05-28 14:07:26 发布