版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_36697353/article/details/87874813
给定一个只包括
'('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()" 输出: true示例 2:
输入: "()[]{}" 输出: true示例 3:
输入: "(]" 输出: false示例 4:
输入: "([)]" 输出: false示例 5:
输入: "{[]}" 输出: true
这道题,写了一会,就是考虑不到全面的,测试用例。我自己的算法大概如下:
class Solution(object):
def isValid(self, s):
"""
:type s: str
:rtype: bool
括号匹配问题,有点像数据结构里面的括号匹配,但是有点忘记当时是怎么处理的了。
"""
#字符串为空,返回false
if s == '':
return True
#考虑到括号都是成对出现的,如果len(s)不能被2整除,那么 返回false
if len(s)%2 != 0:
return False
#可以采用2分的方式,寻找字符串中括号是否成对
d = {'(':")",'{':'}','[':']',')':'(','}':'{',']':'['}
i = len(s)/2
for j in range(len(s)):
if j<=i:
if s[j] != d[s[len(s)-j-1]] and s[j] != d[s[j+1]]:
return False
else:
return True
后面看了一下解答,发现用栈可以解决。思路如下:https://leetcode-cn.com/problems/valid-parentheses/solution/
原始解答思路:
- 我们从表达式的左侧开始,每次只处理一个括号。
- 假设我们遇到一个开括号(即
(
),表达式是否无效取决于在该表达式的其余部分的某处是否有相匹配的闭括号(即)
)。此时,我们只是增加计数器的值保持跟踪现在为止开括号的数目。left += 1
- 如果我们遇到一个闭括号,这可能意味着这样两种情况:
- 此闭括号没有与与之对应的开括号,在这种情况下,我们的表达式无效。当
left == 0
,也就是没有未配对的左括号可用时就是这种情况。- 我们有一些未配对的开括号可以与该闭括号配对。当
left > 0
,也就是有未配对的左括号可用时就是这种情况。- 如果我们在
left == 0
时遇到一个闭括号(例如)
),那么当前的表达式无效。否则,我们会减少left
的值,也就是减少了可用的未配对的左括号的数量。- 继续处理字符串,直到处理完所有括号。
- 如果最后我们仍然有未配对的左括号,这意味着表达式无效。
在这里讨论这个特定算法是因为我们从该解决方案中获得灵感以解决原始
通过栈:
关于有效括号表达式的一个有趣属性是有效表达式的子表达式也应该是有效表达式。(不是每个子表达式)例如
此外,如果仔细查看上述结构,颜色标识的单元格将标记开闭的括号对。整个表达式是有效的,而它的子表达式本身也是有效的。这为问题提供了一种递归结构。例如,考虑上图中两个绿色括号内的表达式。开括号位于索引
1
,相应闭括号位于索引6
。
思路如下:
- 初始化栈 S。
- 一次处理表达式的每个括号。
- 如果遇到开括号,我们只需将其推到栈上即可。这意味着我们将稍后处理它,让我们简单地转到前面的 子表达式。
- 如果我们遇到一个闭括号,那么我们检查栈顶的元素。如果栈顶的元素是一个
相同类型的
左括号,那么我们将它从栈中弹出并继续处理。否则,这意味着表达式无效。- 如果到最后我们剩下的栈中仍然有元素,那么这意味着表达式无效。
代码如下:
class Solution(object):
def isValid(self, s):
"""
:type s: str
:rtype: bool
括号匹配问题,有点像数据结构里面的括号匹配,但是有点忘记当时是怎么处理的了。
"""
l = []
d = {")": "(", "}": "{", "]": "["}
for c in s:
if c in d:
top_element = l.pop() if l else '#'
if d[c] != top_element:
return False
else:
l.append(c)
return not l