目录
1.每日一句
找平凡,找浪漫,找自己
2.作者简介
🏡个人主页:XiaoXiaoChen-2716
📚学习专栏:力扣专栏
🕒发布日期:2022/10/8
『LeetCode|每日一题』移除无效的括号
1.每日一题
2.解题思路(栈)
2.1 思路分析
刚开始看到此题想到了之前做的一个,但是之前的只要统计规范的括号对数,这次需要去掉不规范的,所以想到了用一个标记来标识不规范的括号,并且用一个栈来存不规范的括号的数组下标方便结果的拼接
S1:首先定义一个Integer类型的栈,用来存放不规范数组的下标,然后将字符串转化成数组;
S2:然后就开始遍历数组,如果是字母,我们就直接跳过,因为字母不用处理;
S3:如果是括号,分两种情况,左括号的情况,就直接入栈,注意这里入栈不是入的字符,而是左括号在数组中的下标。如果是右括号,那么得判断此时栈内是不是空,如果不是空,那么左右括号可以组成一组规范的括号,那么把栈顶元素弹出即可,如果是空,那么此时就不是把该括号在数组中的下标入栈,因为先出现右括号一定是不规范的,所以直接把该下标的数组用一个标识符'1'替换;
S4:现在不规范的括号都做了标记了,此时就是要把栈中存的下标在对应数组的位置的字符都改成相同的标识'1',也就是不规范括号所对应在数组中的位置的字符改成标识符'1';
S5:最后用一个循环,把数组中除了'1'的字符全部拼接起来就好了
2.2 核心代码
for(int i = 0 ; i < ss.length ; i++){
if(ss[i] == '('){
stk.push(i);
}else if(ss[i] == ')'){
if(stk.isEmpty() == true){
ss[i] = '1';
}else {
stk.pop();
}
}
}
while(stk.isEmpty() == false){
ss[stk.pop()] = '1';
}
2.3 完整代码
class Solution {
public String minRemoveToMakeValid(String s) {
char[] ss = s.toCharArray();
Stack<Integer> stk = new Stack<>();
for(int i = 0 ; i < ss.length ; i++){
if(ss[i] == '('){
stk.push(i);
}else if(ss[i] == ')'){
if(stk.isEmpty() == true){
ss[i] = '1';
}else {
stk.pop();
}
}
}
while(stk.isEmpty() == false){
ss[stk.pop()] = '1';
}
StringBuffer sb = new StringBuffer();
for(int i = 0 ; i < ss.length ; i++){
if(ss[i] != '1'){
sb.append(ss[i]);
}
}
return sb.toString();
}
}
2.4 运行结果
🍁 类似题目推荐:
如果文章对各位大佬有帮助就支持一下噢,新手尝试,不好的地方请各位大佬多多指教!