题目描述
有效括号字符串为空 “”、“(” + A + “)” 或 A + B ,其中 A 和 B 都是有效的括号字符串,+ 代表字符串的连接。
例如,“”,“()”,“(())()” 和 “(()(()))” 都是有效的括号字符串。
如果有效字符串 s 非空,且不存在将其拆分为 s = A + B 的方法,我们称其为原语(primitive),其中 A 和 B 都是非空有效括号字符串。
给出一个非空有效字符串 s,考虑将其进行原语化分解,使得:s = P_1 + P_2 + … + P_k,其中 P_i 是有效括号字符串原语。
对 s 进行原语化分解,删除分解中每个原语字符串的最外层括号,返回 s
示例
示例 1:
输入:s = “(()())(())”
输出:“()()()”
解释:
输入字符串为 “(()())(())”,原语化分解得到 “(()())” + “(())”,
删除每个部分中的最外层括号后得到 “()()” + “()” = “()()()”。
示例 2:
输入:s = “(()())(())(()(()))”
输出:“()()()()(())”
解释:
输入字符串为 “(()())(())(()(()))”,原语化分解得到 “(()())” + “(())” + “(()(()))”,
删除每个部分中的最外层括号后得到 “()()” + “()” + “()(())” = “()()()()(())”。
示例 3:
输入:s = “()()”
输出:“”
解释:
输入字符串为 “()()”,原语化分解得到 “()” + “()”,
删除每个部分中的最外层括号后得到 “” + “” = “”。
解题过程
思路及步骤
(1)可以考虑使用栈去存储这些括号,但其实仔细想一下不用去真实的存储数据,只需要记录长度即可;
(2)设置临时变量 count,来记录长度,int 类型的,然后再设置一个临时变量 stringBuilder 去存储最终的结果,StringBuilder 类型的;
(3)遍历原始字符串,若当前字符为 '(',则 count 自增 1,同时如果该次自增之后 count 等于 1,则 continue 掉本次循环,当前字符不需要写入 stringBuilder 中;
(4)若当前字符为 ')',则 count 自减 1,同时如果该次自减之后 count 等于 0,则 continue 掉本次循环,当前字符不需要写入 stringBuilder 中;
(5)最后使用 toString() 方法将 stringBuilder 转换为 String 即可。
代码展示
public class RemoveOuterParentheses {
public static String removeOuterParentheses(String s) {
StringBuilder stringBuilder = new StringBuilder();
int count = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '(') {
count++;
if (count == 1) {
continue;
}
} else {
count--;
if (count == 0) {
continue;
}
}
stringBuilder.append(s.charAt(i));
}
return stringBuilder.toString();
}
public static void main(String[] args) {
String s = "(()())";
String result = removeOuterParentheses(s);
System.out.println(result);
}
}
图解示例
(1)对于字符串 “()” 来说,这一对括号就是外层括号,那么移除之后便是空字符串 “” 了。具体处理流程为:
i = 0 时,字符为 ‘(’,进行 count++ 操作,自增之后因为此时 count == 1,所以不需要记录 stringBuilder 中;
i = 1 时,字符为 ‘)’,进行 count-- 操作,自减之后因为此时 count == 1,所以不需要记录 stringBuilder 中;
(2)对于字符串 “(())(()())” 来说,最终移除外层括号之后的结果为:“()()()”。具体处理流程为: