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); } else if ((*(s+i)==(*(ptr+a)+1 ))||(*(s+i)==(*(ptr+a)+2 ))) { a--; } else return 0 ; } if (a) return 0 ; return 1 ;
简单来说,这题用栈还是快一些的
啊啊啊,今天还是简单题,不行,明天做道困难题= =,还是不太行,明天有课,做道中等题,后天做困难
关于自己的生活,我和你都不是读者,而是作者。至少结局,还是能自己说了算的。
-「银魂」