我在leetcode中的第二题
第一题
前言
要想学好计算机算法至关重要
一、leetcode算法第二题
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
示例 4:
输入:s = “([)]”
输出:false
示例 5:
输入:s = “{[]}” 输出:true
提示:
1 <= s.length <= 10^4
s 仅由括号 ‘()[]{}’ 组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解题方法:
1.方法一:
思想:
这个算法运用栈的后进先出的特性来帮助解题:
先创建一个栈,
然后在将这个字符串的第一个字符存入栈中。
然后建立循环,从第二个字符开始依次向后循环,
然后判断栈尾和将要进栈的字符是否成对,
如果成对则出栈,
如果不成对则将这两个字符都存入栈中。
最后判断栈中是否有字符,如果有则这个字符串无效,若没值则这个字符串有效。
如图:
代码:
public class Solution {
public boolean isValid(String s) {
//创建一个栈
Stack<Character> stack = new Stack<>();
//将字符串转换成字符数组
char[] chars = s.toCharArray();
//将字符串的第一个值入栈
stack.push(chars[0]);
//用于保存出栈的值。
char ch;
for (int i = 1; i < chars.length; i++) {
// 判断栈是否为空,如果为空直接将当前的数组的值入栈
if(stack.isEmpty()){
stack.push(chars[i]);
}else{
//将栈的栈顶元素出栈
ch = stack.pop();
//如果栈顶元素和当前元素不匹配则将栈顶元素和当前元素入栈
//注意:先入栈栈顶元素。
if(!(ch == '[' && chars[i] == ']'
|| ch == '{' && chars[i] == '}'
|| ch == '(' && chars[i] == ')')){
stack.push(ch);
stack.push(chars[i]);
}
}
}
//最后判断栈是否为空,
//为空则这个字符串有效
//不为空则这个字符串无效
if(stack.isEmpty()){
return true;
}
return false;
}
}
总结
这道算法题主要是考察栈的运用,用栈后进先出的特征进行解题。