给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
思路:
利用stack的性质,遍历string,遇到左半部分,将相应的右半部分放入栈中
遍历时,有三种情况
- 栈空,string未结束,返回false
- string[i]与栈顶元素不同,返回false
- 栈非空,遍历结束,返回false 或者 遍历结束,且栈为空,返回true
public class Solution {
public bool IsValid(string s) {
var len = s.Length;
if(len % 2 != 0) return false;
Stack<char> stack = new Stack<char>();
for(int i = 0; i < len; i++)
{
if(s[i] == '(')
stack.Push(')');
else if(s[i] == '{')
stack.Push('}');
else if(s[i] == '[')
stack.Push(']');
else if(stack.Count == 0 || s[i] != stack.Pop())//栈空 或者 栈顶与s[i]不等
return false;
}
if(stack.Count == 0)//遍历结束,栈空
return true;
else return false;
}
}
复杂度分析
- 时间复杂度:O(n),其中 n 是字符串 s 的长度。当 n 是奇数时直接返回 false,时间复杂度是 O(1)。当 n 是偶数时,需要遍历字符串 s 一次,每个字符的操作时间都是 O(1),总时间复杂度是 O(n)。
- 空间复杂度:O(n),其中 n 是字符串 s 的长度。空间复杂度主要取决于栈空间,栈内的元素个数为 O(n)。