题目
有效的括号
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
- 思路:使用栈来进行操作,必须先将栈顶元素与当前剩下的字符中的第一个进行比较,匹配上了将之栈顶删除,否则将当前的元素添加到栈中,最后判断栈是否为空即可返回
class Solution {
public boolean isValid(String s) {
Deque<Character> deque=new ArrayDeque<>();
for(int i=0;i<s.length();i++){
char m=s.charAt(i);
if(deque.isEmpty()){
deque.addLast(m);
}else{
if(isMatch(deque.peekLast(),m)){
deque.pollLast();
}else{
deque.addLast(m);
}
}
}
return deque.isEmpty();
}
public boolean isMatch(char a,char b){
if(a=='('&&b==')'){
return true;
}else if(a=='['&&b==']'){
return true;
}else if(a=='{'&&b=='}'){
return true;
}else{
return false;
}
}
}
1047. 删除字符串中的所有相邻重复项
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
- 该题主要思路如下:首先这是一道经典的可以使用匹配来处理的题目,可以使用栈将字符串中的元素push进去,而一旦当前的字符与栈顶的字符一致,将栈顶删除,注意,使用peekLast获得的元素,在当前栈为空时,返回null值
- 也可以直接使用字符串作为栈,省去将栈转换成字符串的时间。java中可以使用StringBuilder构建字符串,使用Deque实现栈
public String removeDuplicates(String s) {
StringBuilder sb=new StringBuilder();
for(int i=0;i<s.length();i++){
char m=s.charAt(i);
if(sb.length()==0){
sb.append(m);
}else {
if(m==sb.charAt(sb.length()-1))
sb.deleteCharAt(sb.length()-1);
else{
sb.append(m);
}
}
}
return sb.toString();
}
150. 逆波兰表达式求值
给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
注意:
有效的算符为 ‘+’、‘-’、‘*’ 和 ‘/’ 。
每个操作数(运算对象)都可以是一个整数或者另一个表达式。
两个整数之间的除法总是 向零截断 。
表达式中不含除零运算。
输入是一个根据逆波兰表示法表示的算术表达式。
答案及所有中间计算结果可以用 32 位 整数表示。
-
思路:该题能够第一时间想到使用栈进行操作,但是需要考虑到token的字符串中的类型,会不会是一个计算的表达式,但是通过示例看,应当没有计算表达式,因此代码如下:
-
`class Solution {
public int evalRPN(String[] tokens) {
Deque myDeque=new ArrayDeque<>();
for(int i=0;i<tokens.length;i++){
String m=tokens[i];
boolean flag=isMatch(m);
if(flag==true){
int x=myDeque.pollLast();
int y=myDeque.pollLast();
int temp=compute(y,x,m);
myDeque.addLast(temp);
}else{
int n=Integer.parseInt(m);
myDeque.addLast(n);
}
}
return myDeque.peekLast();}
public boolean isMatch(String a){
if(“+”.equals(a)||“-”.equals(a)||“/”.equals(a)||"“.equals(a)){
return true;
}
return false;
}
public int compute(int a,int b,String s){
if(”+“.equals(s))
return a+b;
else if(”-“.equals(s)){
return a-b;
}else if(”/".equals(s)){
return a/b;
}else{
return ab;
}
}
}`