每天一道算法题系列:
来源:力扣(LeetCode)
本题链接:https://leetcode-cn.com/problems/valid-parentheses/
来源是力扣,大家喜欢可以去力扣中文网做相应的其他的题,某浏览器直接搜力扣即可。
本题难度是简单
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
package com.example.likou.likou7;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
/**
* 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
*
* 有效字符串需满足:
*
* 左括号必须用相同类型的右括号闭合。
* 左括号必须以正确的顺序闭合。
* 注意空字符串可被认为是有效字符串。
*
* 示例 1:
* 输入: "()"
* 输出: true
* 示例 2:
* 输入: "()[]{}"
* 输出: true
* 示例 3:
* 输入: "(]"
* 输出: false
*/
public class IsValid {
public static boolean isValid(String s) {
//如果括号是奇数,直接返回
if(s.length() % 2 != 0 ){
return false;
}
//定义括号
Map<Character,Character> map = new HashMap<Character,Character>(){{
put('{','}'); put('[',']'); put('(',')'); put('?','?');
}};
//定义栈 先进后出
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
//判断字符串的第一个字符是否在map中
if(!map.containsKey(s.charAt(i))){
//如果栈不为空或者s的下一个值不等于栈的值 就报错
//stack.peek() 和 stack.pop()都是返回栈的最近的值
//区别在于pop会把值弹出栈 而peek不会把值弹出
if(stack.isEmpty() || map.get(stack.peek()) != s.charAt(i)){
System.out.println(map.get(stack.peek()) != map.get(s.charAt(i)));
return false ;
}
//直接弹出,表示括号对应上了
stack.pop();
}else {
/*
如果map没有包含s里面的值在取反,表示这此输入的值是一个开始的括号([{
我们就把他压入栈中,后面如果遇到了)]}来进行判断的时候,只需要取它是否等于栈中的值
对应map里面的key对应的value是否相等就行了
*/
stack.push(s.charAt(i));
}
}
return stack.isEmpty() ;
}
public static void main(String[] args) {
System.out.println(isValid("([]{)"));
}
}
上一篇文章:每天一道算法题系列十八之删除链表的倒数第N个节点
请继续关注我,如果后面不忙了,会写一系列关于的设计模式等等等的文章。
如果本篇内容有问题,请第一时间联系我,我会第一时间修改。
谢谢大家。