难度:简单
题目:
有效括号字符串为空
""
、"(" + 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 <= s.length <= 105
s[i]
为'('
或')'
s
是一个有效括号字符串
Related Topics
- 栈
- 字符串
重点!!!解题思路
A方法--:直接遍历字符串和计数器的结合来解题
B方法--:如题目中一样拆分成原语后再删除括号
A方法源码+讲解:
class Solution {
public String removeOuterParentheses(String s) {
String str=""; //拼接字符串
int opened=0; //计数器
for(char c:s.toCharArray()){ //遍历s字符串
if (c=='(' && opened++>0){ //当获取到左括号,我们看看是不是第二个左括号,如果是那么我们就拼到字符串中,如果不是opened就+1
str+=c;
}
if (c==')' && opened-->1){ //当获取到右括号,我们判断计数器是不是大于1,如果大于1相当于前面有大于1个左括号,这是这个右括号肯定不用删除,我们正常拼接
str+=c;
}
}
return str;
}
}
B方法源码+讲解:
class Solution {
public String removeOuterParentheses(String s) {
String last=""; //拼接字符串
int cnt=0; //计数器
int beginIndex=0; //字符串截取的头下标
int lastIndex=0; //字符串截取的尾下标
for (int i=0;i<s.length();i++){ //遍历字符串
if (s.charAt(i)=='('){ //当遍历到左括号时判断一下计数器是不是0,如果是0就意味着这个是原语的开始,那就记录一下
if (cnt==0){
beginIndex=i;
}
cnt++; //有一个左括号就+1
}else {
cnt--; //有一个右括号就-1
if (cnt==0){ //当计数器再次=0时,说明前面的括号和右面的括号相等,那么此时这个位置就是原语的结尾,记录一下
lastIndex=i;
last+=s.substring(beginIndex+1,lastIndex); //截取字符串,左闭右开原则,截取内部括号,然后拼接到一起
}
}
}
return last;
}
}
如果您还有什么疑问或解答有问题,可在下方评论,我会及时回复。
系列持续更新中,点个订阅吧