目录
1.每日一句
苦尽甘来的那一天,山河日月都做贺礼
2.作者简介
🏡个人主页:XiaoXiaoChen-2716
📚学习专栏:力扣专栏
🕒发布日期:2022/10/4
『LeetCode|每日一题』使括号有效的最少添加
1.每日一题
2.解题思路(栈)
2.1 思路分析
首先看到这题,就想到了配对,字符串中的元素和栈内的元素配对,成功则出栈,不成功就需要加一个
S1:首先分析,栈有两种情况,空和非空,我们可以把左括号全都放栈内,让右括号去配对;
S2:当栈不为空时,这时来了个右括号,那么可以和栈内的左括号配对,所以把栈顶元素出栈,如果此时来了个左括号,那么入栈;
S3:当栈为空时,如果此时来了个右括号,那么栈内没有可以配对的,所以定义一个变量来存需要加的括号,即num+1,如果此时来了左括号,那么同样也是入栈;
S4:最后如果字符串遍历配对完了,此时栈内的括号都是没有配对的,所以还得加上栈的长度才是最后的结果
2.2 核心代码(栈)
Stack<Character> stk = new Stack<>();
for(int i = 0 ; i < s.length() ; i++){
char c = s.charAt(i);
if(c == '('){
stk.push(c);
}else {
if(stk.empty() == false){
stk.pop();
}else {
num += 1;
}
}
}
num += stk.size();
2.3 完整代码
class Solution {
public int minAddToMakeValid(String s) {
int num = 0;
Stack<Character> stk = new Stack<>();
for(int i = 0 ; i < s.length() ; i++){
char c = s.charAt(i);
if(c == '('){
stk.push(c);
}else {
if(stk.empty() == false){
stk.pop();
}else {
num += 1;
}
}
}
num += stk.size();
return num;
}
}
2.4 运行结果
3.解题思路(贪心算法)
3.1 思路分析
此题用栈解,可见空间复杂度还是没能降到最低,所以左括号的存储也可以用一个变量来存
首先定义一个left来存左括号的数量,思路还是和上面一样,就是用变量代替了栈
3.2 核心代码
for(int i = 0 ; i < s.length() ; i++){
char c = s.charAt(i);
if(c == '('){
left++;
}else {
if(left > 0){
left--;
}else {
num += 1;
}
}
}
num += left;
3.3 完整代码
class Solution {
public int minAddToMakeValid(String s) {
int left = 0;
int num = 0;
for(int i = 0 ; i < s.length() ; i++){
char c = s.charAt(i);
if(c == '('){
left++;
}else {
if(left > 0){
left--;
}else {
num += 1;
}
}
}
num += left;
return num;
}
}
3.4 运行结果
总结:贪心算法有效的减少了空间的利用,可以看到空间复杂度降到了O(1)
🍁 类似题目推荐:
如果文章对各位大佬有帮助就支持一下噢,新手尝试,不好的地方请各位大佬多多指教!