刷前必备知识:
数据结构:栈的知识,Java:字符串的处理
题目内容:
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([])"
输出:true
提示:
1 <= s.length <= 104
s
仅由括号'()[]{}'
组成
思路分析:
要判断给定的只包括括号的字符串是否有效,我们可以使用栈(Stack)来实现。这是因为有效的括号序列必须遵循后进先出(LIFO)的原则,刚好符合栈的特点。
1.使用栈:使用Java的Stack类来存储左括号。
2.遍历字符串:遍历输入字符串的每一个字符:
a.如果是左括号,就将其推入栈中。
b.如果是右括号,首先检查栈是否为空,如果栈为空,说明没有左括号与匹配
c.是右括号,且栈不为空,弹出顶栈元素与之匹配
3.类型匹配:确保弹出的左括号与当前的右括号匹配,,如果不匹配,返回false。
4.最终检查:在遍历结束后,检查栈是否为空,,为空,说明所有的括号都已正确匹配。
Java代码实现:
public boolean isValid(String s) {
//创建一个栈来存储左括号
Stack<Character> stack = new Stack<>();
//遍历字符串数组
for(char c : s.toCharArray()){
//如果遇到左括号,则压入栈中
if( c == '(' || c == '{' || c == '['){
stack.push(c);
}else{
//如果遇到右括号
if(stack.isEmpty()){ //判断栈是否为空
return false; //找到一个没有对应左括号的右括号
}
//为空,取出顶栈元素进行匹配
char top = stack.pop();
if( (c == ')' && top != '(') || (c == '}' && top != '{') || ( c == ']' && top != '[' )){
return false;
}
}
}
return stack.isEmpty(); //判断整个字符串中所有的括号是否都已成功配对和闭合
}
复杂度分析:
1.时间复杂度:On,其中n是字符串的长度,每个字符只遍历一次。
2.空间复杂度:On,在最坏的情况下,所有的字符都是左括号。
总结:
根据有序的括号必须遵循后进先出的原则,选择使用栈来灵活解决。
好的到此今日的每天一道力扣结束啦,关注我,和我一起在力扣中成长吧!!![比心][比心]