题目
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
提示:
1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成
解析
其实这道题并不难,这种括号匹配的问题就是用栈来实现,而栈的特点就是先进后出,后进先出。可以想象一下,先用最简单的匹配的字符串,就“()”,我们把左括号入栈,当我们读入下一个括号时,发现两个匹配,我们把左括号出栈,我们的栈最后是没有符号的
来一个稍微难一点的“({}[])”,“(”先入栈,读入下一个字符“{”,继续入栈,下一个“}”,发现与栈的顶端即数组的末端是匹配的,那么我们就把“{”出栈,下一个字符“[”入栈,读入下一个字符“]”,与栈顶“[”匹配,“[”出栈,下一个字符“)”,与栈顶“(”匹配,“(”出栈,此时栈为空
再来一个不匹配的“({)}”,第一个符号“(”入栈,继续读入下一个符号“{”入栈,再读入“)”,发现与栈顶的“{”不匹配,这时我们的程序直接返回False
在这道题中,我们也不必要去很费事的写一堆代码实现对栈的初始化,入栈,出栈等操作,我们只需要创建一个数组去模仿栈,只要具有栈的特点后进先出就ok。创建栈就是创建一个数组,入栈就是把符号放进数组中,出栈就是把数组末尾的指针减一。
此外,在C语言中,小编觉得创建一个动态的数组比较好,更加灵活的分配空间。C语言如果不事先定义好True和False的话,直接使用会报错,所以小编在C语言的程序中使用1和0代替True和False
c语言
bool isValid(char * s)
{
//l存储字符串长度
int l=strlen(s);
//创建一个动态数组存储括号
char *q=(char*)malloc(l*sizeof(char));
//字符串和数组的下标
int i=0,j=0;
for(;i<l;i++)
{
//如果此时字符串为右括号,但是数组里面没有括号
//说明没有对应的左括号,匹配失败
if((s[i]==')'||s[i]==']'||s[i]=='}')&&j==0)
return 0;
//如果此时字符串为左括号,将该符号存储值数组中
if(s[i]=='{'||s[i]=='('||s[i]=='[')
q[j++]=s[i];
//如果此时字符串为右括号,与在数组的最后一位比较
//如果匹配成功,数组长度减一
//下一次循环的左括号直接覆盖原来的符号
else if(s[i]=='}'&&q[j-1]=='{')
j--;
else if(s[i]==')'&&q[j-1]=='(')
j--;
else if(s[i]==']'&&q[j-1]=='[')
j--;
//匹配失败
else
return 0;
}
//程序执行到此时,说明右括号全部匹配到对应的左括号
//只需判断此时是否还有剩余的左括号
//即数组是否为空判断字符串是否匹配成功
if(j==0)
return 1;
else
return 0;
}
python
在python中我们用列表实现栈的操作,因为我们的列表初始时设置为空列表,所以在进行入栈出栈等操作时要使用append和del函数,代码稍微冗杂,原理与C语言一样
class Solution:
def isValid(self, s: str) -> bool:
l=len(s)
q=[]
j=0
for i in range(l):
if (s[i]==')' or s[i]==']' or s[i]=='}') and j==0:
return False
if s[i]=='(' or s[i]=='{' or s[i]=='[':
q.append(s[i])
j+=1
elif s[i]==')' and q[j-1]=='(':
j-=1
del q[j]
elif s[i]=='}' and q[j-1]=='{':
j-=1
del q[j]
elif s[i]==']' and q[j-1]=='[':
j-=1
del q[j]
else:
return False
if j==0:
return True
else:
return False
python的代码小编写的确实是比C语言要长一些,而且执行后的效果也不太好,只能说还有很长的路要走