2506 · 删除不匹配的括号
题目描述:
你将得到一个由小写字母 a-z ,左括号 ‘(’ 和右括号 ‘)’ 构成的字符串 s。
你的任务是删除尽可能少的括号,使得 s 里面的括号匹配。
你需要返回删除括号后的字符串。
由于答案可能会有很多,所以你只需要返回任意一个正确答案。
例如:”()”, “(())”, “()()”, “(())()” 是括号匹配的字符串, 而 “)(”, “(()”, “()()(”, “()())” 则是括号不匹配的字符串。
解法:
这个问题可以利用堆栈的思想:
- 开始检测
- 遇到
(
即执行压栈的操作 - 遇到
)
先检查栈顶的元素是否是(
:- 是的话就将栈顶元素给去除
- 不是 就是栈里为空
- 遇到
- 整体结束后 检查栈是否为空,若不为空 就将 栈里的元素下标压入要去除的下标中
python版本解法:
class Solution:
"""
@param s: A string with lowercase letters and parentheses
@return: A string which has been removed invalid parentheses
"""
def removeParentheses(self, s: str) -> str:
# write your code here.
str1 = '' #对应的括号
list1 = [] #记录的下标
rem = [] #要删除的内容
length = len(s)
for i in range(length):
if s[i] == '(':
str1+=s[i]
list1.append(i)
elif s[i] == ')':
if len(str1) == 0 or str1[-1] !='(':
rem.append(i)
else:
str1 = str1[:-1]
list1.pop()
if str1 != '':
for i in list1:
rem.append(i)
result = ''
for i in range(length):
if i not in rem:
result += s[i]
return result
java解决办法:
呃,这个 不好意思,暂时没写出来,之前被调bug给搞傻,后面有时间再来补
1721 · 使括号有效的最少添加
题目变种:
描述
给定一个由 ‘(’ 和 ‘)’ 括号组成的字符串 S,我们需要添加最少的括号( ‘(’ 或是 ‘)’,可以在任何位置),以使得到的括号字符串有效。
从形式上讲,只有满足下面几点之一,括号字符串才是有效的:
它是一个空字符串,或者
它可以被写成 AB (A 与 B 连接), 其中 A 和 B 都是有效字符串,或者
它可以被写作 (A),其中 A 是有效字符串。
给定一个括号字符串,返回为使结果字符串有效而必须添加的最少括号数。
java解法:
public class Solution {
/**
* @param S: the given string
* @return: the minimum number of parentheses we must add
*/
public int minAddToMakeValid(String S) {
// Write your code here
String str1 = "";
int count = 0;
for(int i =0 ;i<S.length();i++){
if(S.charAt(i) == '('){
str1 += '(';
}
else if(S.charAt(i) == ')'){
if(str1.length()!=0){ //栈中只会存在前括号 不为0时 必定匹配
str1 = str1.substring(0,str1.length()-1);
}
else{ //栈中为空 //有后括号 无前括号 需要加个1
count++;
}
}
}
if(!str1.equals("")){ //不为空 栈中有剩余的 ( 左括号存在
count +=str1.length();
}
return count;
}
}
java精选解法:
public class Solution {
/**
* @param S: the given string
* @return: the minimum number of parentheses we must add
*/
public int minAddToMakeValid(String S) {
// Write your code here
// Write your code here
int left = 0, right = 0;
for (char i : S.toCharArray()) {
if (right == 0 && i == ')') {
// 当前需要增加的右括号数量为0且出现了右括号时,需要增加的左括号数量+1
left++;
} else {
// 否则如果当前遇到的是左括号,那么需要增加的右括号数量+1,如果遇到的是右括号则-1
right += i == '(' ? 1 : -1;
}
}
return left + right;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/114565.html