20.有效的括号 1047.删除字符串中的所有相邻重复项 150. 逆波兰表达式求值
20.有效的括号
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
用栈来做
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
int i = 0;
while (i < s.length()){
if (s.charAt(i) == '(' || s.charAt(i) == '{' || s.charAt(i) == '['){
stack.push(s.charAt(i));
}
if (s.charAt(i) == ')' || s.charAt(i) == '}' || s.charAt(i) == ']'){
if (stack.isEmpty()) return false;
char temp = stack.pop();
if (temp == '('){
if (s.charAt(i) != ')') return false;
} else if (temp == '{') {
if (s.charAt(i) != '}') return false;
} else {
if (s.charAt(i) != ']') return false;
}
}
i++;
}
if (!stack.isEmpty()) return false;
return true;
}
1047. 删除字符串中的所有相邻重复项
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:
输入:“abbaca”
输出:“ca”
解释:例如,在 “abbaca” 中,我们可以删除 “bb” 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 “aaca”,其中又只有 “aa” 可以执行重复项删除操作,所以最后的字符串为 “ca”。
用栈
class Solution {
public String removeDuplicates(String s) {
Stack<Character> s1 = new Stack<>();
Stack<Character> s2 = new Stack<>(); //辅助栈
for (int i = 0; i < s.length(); i++){
if (s1.isEmpty()){
s1.push(s.charAt(i));
continue;
}
if (s.charAt(i) == s1.peek()){
s1.pop();
}else {
s1.push(s.charAt(i));
}
}
while (!s1.isEmpty()){
s2.push(s1.pop());
}
String result = "";
while (!s2.isEmpty()){
result += s2.pop();
}
return result;
}
}
150. 逆波兰表达式求值
用两个栈来做
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> stack = new Stack<>();
int num1,num2,result;
for (int i = 0; i < tokens.length; i++) {
if (tokens[i].equals("+")){
num1 = stack.pop();
num2 = stack.pop();
result = num2 + num1;
stack.push(result);
} else if (tokens[i].equals("-")) {
num1 = stack.pop();
num2 = stack.pop();
result = num2 - num1;
stack.push(result);
} else if (tokens[i].equals("*")) {
num1 = stack.pop();
num2 = stack.pop();
result = num2 * num1;
stack.push(result);
} else if (tokens[i].equals("/")) {
num1 = stack.pop();
num2 = stack.pop();
result = num2 / num1;
stack.push(result);
}else {
stack.push(Integer.valueOf(tokens[i]));
}
}
return stack.pop();
}
}
总结
这三道题比较简单。