算法思想一:栈+哈希表
解题思路:
算法流程
1、构建哈希表 k,其中key为 右括号,value为左括号
2、遍历字符串
1、判断字符是否在 k.values() 中;
若在其中则字符入栈;
否则判断栈是否为空 或者 该字符的 values 是否与 栈顶元素相同;若不同则直接返回 false,若相同则栈顶元素出栈
3、判断栈内元素是否为空,为空则返回 true,反之返回 false
图解:
代码展示:
Python版本
class Solution:
def isValid(self , s ):
# write code here
# 哈希表
k = {'}':'{', ')':'(', ']':'['}
stack = []
# 遍历字符串
for a in s:
if a in k.values():
stack.append(a)
elif not stack&nbs***bsp;k[a] != stack.pop():
return False
# 如果栈内没有字符则表示 true,反之则 false
return len(stack) == 0 复杂度分析
时间复杂度O(N):N表示字符串的长度,遍历字符串
空间复杂度O(N):最差情况下栈内存储n个字符串,哈希表存储空间
算法思想二:栈
解题思路:
建立一个栈,存储遍历的字符串再进行对比 1、遍历字符串遇到 ‘(’ '[' '{' 左括号,就把相应的右括号(‘)’ ']' '}')入栈
2、如果遍历遇到右括号 ‘)’ ']' '}' ,则判断是否和栈顶元素相同
1、不同则直接返回false
2、相同则将栈顶元素出栈
3、遍历结束判断栈是否为空
图解:
代码展示:
JAVA版本
import java.util.*;
public class Solution {
/**
*
* @param s string字符串
* @return bool布尔型
*/
public boolean isValid (String s) {
// write code here
Stack<Character>stack = new Stack<Character>();
for(char c: s.toCharArray()){
// 碰到左括号,就把相应的右括号入栈
if(c=='(')stack.push(')');
else if(c=='[')stack.push(']');
else if(c=='{')stack.push('}');
// 如果是右括号判断是否和栈顶元素匹配
else if(stack.isEmpty()||c!=stack.pop())return false;
}
// 最后判断栈中元素是否匹配
return stack.isEmpty();
}
} 复杂度分析
时间复杂度O(N):N表示字符串的长度,遍历字符串
空间复杂度O(N):最差情况下栈内存储n个字符串



京公网安备 11010502036488号