[代码随想录] 第十天
20.有效的括号[https://leetcode.cn/problems/valid-parentheses/]
思路:使用栈存放字符元素,遇到左括号就进栈,遇到右括号就弹出栈顶元素判断是否匹配。注意其实判断字符串长度是否为偶数进行剪枝,并且结束时判断栈是否为空。
class Solution {
public boolean isValid(String s) {
if (s.length() % 2 != 0) {
return false;
}
char[] temp = new char[s.length()];
for (int i = 0; i < s.length(); i++) {
temp[i] = s.charAt(i);
}
char res;
Stack<Character> sc = new Stack<>();
for (char c : temp) {
if (c == '(' || c == '{' || c == '[') {
sc.push(c);
} else if ((c == ')' || c == '}' || c == ']') && (!sc.isEmpty())) {
res = sc.pop();
if ((res == '(' && c == ')') || (res == '{' && c == '}') || (res == '[' && c == ']')) {
} else {
return false;
}
} else {
return false;
}
}
return sc.isEmpty();
}
}
-----------------------------------------------------------------------------------------------
优化思路:遍历字符串时,遇到左括号时,将与之对应的右括号进栈,遇到右括号时便只需要判断栈顶元素与当前元素是否相等。
-----------------------------------------------------------------------------------------------
class Solution {
public boolean isValid(String s) {
if (s.length() % 2 != 0) {
return false;
}
char res;
Stack<Character> sc = new Stack<>();
for(int i =0;i<s.length();i++){
if(s.charAt(i)=='{'){
sc.push('}');
}else if(s.charAt(i)=='['){
sc.push(']');
}else if(s.charAt(i)=='('){
sc.push(')');
}else if((sc.isEmpty())|| (s.charAt(i)!=sc.peek())){
return false;
}else
sc.pop();
}
return sc.isEmpty();
}
}
但是运行速度还不如我的笨方法....
**-----------------------分割线-------------------------**
1047.删除字符串中的所有相邻重复项[https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/]
思路:其实与上题思路相同,都是在遍历每个元素值,根据栈顶元素判断是栈顶元素出栈还是遍历元素进栈。但是栈中元素出栈再逆置字符串较为麻烦。
class Solution {
public String removeDuplicates(String s) {
Stack<Character> sc = new Stack<>();
for(int i=0;i<s.length();i++){
if( !sc.isEmpty() &&sc.peek()==s.charAt(i)){
sc.pop();
}else{
sc.push(s.charAt(i));
}
}
String temp="";
while(!sc.isEmpty()){
temp+=sc.pop();
}
String ans="";
int i = temp.length()-1;
char res;
int j=0;
while(i >= 0){
ans+=temp.charAt(i);
i--;
}
return ans;
}
}
在这题中,不使用栈使用StringBuilder代替栈,可能运行速度会更快。
**-----------------------分割线-------------------------**
150. 逆波兰表达式求值 [https://leetcode.cn/problems/evaluate-reverse-polish-notation/]
思路:利用栈,遍历字符数组,数字进栈,符号出栈两个数字进行相应操作,结果再入栈。最后结果就是栈底元素。
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> num = new Stack<>();
int n1, n2;
for (int i = 0; i < tokens.length; i++) {
switch (tokens[i]) {
case "+":
n1 = num.pop();
n2 = num.pop();
num.push(n2 + n1);
break;
case "-":
n1 = num.pop();
n2 = num.pop();
num.push(n2 - n1);
break;
case "*":
n1 = num.pop();
n2 = num.pop();
num.push(n2 * n1);
break;
case "/":
n1 = num.pop();
n2 = num.pop();
num.push(n2 / n1);
break;
default:
num.push(Integer.parseInt(tokens[i]));
}
}
return num.pop();
}
}

浙公网安备 33010602011771号