leetcode: 有效的括号

给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

这题如果让我用C/C++就是用栈的知识了,对于括号不断压栈直到有相对应的消掉,现在用python也是一样的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution(object):
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
dict = {"(" : 1, ")" : -1, "{" : 2, "}" : -2, "[" : 3, "]" : -3}
str_s = []
for i in s:
if len(str_s) == 0:
str_s.append(i)
elif dict[i] + dict[str_s[-1]] == 0:
del str_s[-1]
else:
str_s.append(i)
return len(str_s) == 0;

评论区看到一些有趣的做法,对啊,python可以直接替换,替换到最后若为空就是真的

1
2
3
4
5
6
7
class Solution:
def isValid(self, s):
while '{}' in s or '()' in s or '[]' in s:
s = s.replace('{}', '')
s = s.replace('[]', '')
s = s.replace('()', '')
return s == ''

简洁明了不过因为循环的问题需要遍历多次比如[[[]]]这样的就需要循环很多次浪费了时间

还有一个C的大佬,原本C就速度快,这个大佬这个几乎0ms= =

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int length=0;//定义字符串长度
while(*(s+length))length++;//获取字符串长度
char* ptr=(char*)malloc(length/2);//分配内存空间
memset(ptr,0,length/2);//初始化内存空间
int i,a=0;
for(i=0;i<length;i++)
{
if((*(s+i)=='(')||(*(s+i)=='{')||(*(s+i)=='['))
{
a++;
*(ptr+a)=*(s+i);
}
//'('与')'的ASCII值差1,'['与']','{'与'}'的ASCII值差2
else if((*(s+i)==(*(ptr+a)+1))||(*(s+i)==(*(ptr+a)+2)))
{
a--;
}
else return 0;
}
if(a)
return 0;
return 1;

简单来说,这题用栈还是快一些的

啊啊啊,今天还是简单题,不行,明天做道困难题= =,还是不太行,明天有课,做道中等题,后天做困难

关于自己的生活,我和你都不是读者,而是作者。至少结局,还是能自己说了算的。

-「银魂」