有效的括号
问题
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
问题分析
可采用栈来解决问题,遍历字符串,遇到左括号就压入相应的右括号,然后遇到右扣号如果与当前栈顶符号相同,就弹出,顺利执行完后栈为空就说明字符串有效。
字符串无效,不匹配的情况:
- 左括号多余,遍历结束后,栈不为空
- 扣号不匹配,遍历到右扣号时与当前栈顶符号不同
- 右方向的扣号多余,遍历到右扣号时栈为空
代码
public boolean isValid(String s) {
Stack<Character> stack=new Stack();
for(int i=0;i<s.length();i++){
//压入对应匹配的右括号
if(s.charAt(i)=='(') stack.push(')');
else if(s.charAt(i)=='{') stack.push('}');
else if(s.charAt(i)=='[') stack.push(']');
//栈为空右扣号多了,或者没有匹配的字符括号
else if(stack.isEmpty()||stack.peek()!=s.charAt(i)) return false;
//stack.top与s.charAt(i)相等时,弹出元素
else stack.pop();
}
//栈为空返回ture,不为空返回false
return stack.isEmpty();
}
删除字符串中的所有相邻重复项
问题
给出由小写字母组成的字符串S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
问题分析
删除相邻的重复项,可使用栈来处理,遍历字符串,将每个字符依次压栈,在压栈过程中判断栈顶元素是否与其相同,是则表示这两个元素是相邻重复项,弹出栈顶元素,并且不压入这个字符。
代码
public String removeDuplicates(String S) {
Stack<Character> stack=new Stack();
for(int i=0;i<S.length();i++){
//判断是否有相邻重复项
if(!stack.isEmpty()&&stack.peek().equals(S.charAt(i))){
stack.pop();
}
else{
stack.push(S.charAt(i));
}
}
StringBuilder result=new StringBuilder();
while(!stack.isEmpty()){
result.append(stack.pop());
}
return result.reverse().toString();
}