关于第20讲的问题求助各位大神
题目是这样的:0. 请编写一个程序,判断给定的字符串 s 中括号的写法是否合法。
字符串仅包含 '('、')'、'['、']'、'{'、'}' 这三对括号的组合
左右括号必须成对编写,比如 "()" 是合法的,"(" 则是非法的
左右括号必须以正确的顺序闭合,比如 "{()}" 是合法的,"{(})" 则是非法的
然后我想了好几天都没有想出来。看了答案,还是不太明白。
s = input("请输入测试字符串:")
stack = []
for c in s:
# 如果是左括号,那么添加到特殊列表中
if c == '(' or c == '[' or c == '{':
stack.append(c)
else:
if len(stack) == 0:
print("非法T_T")
break
if c == ')':
d = '('
elif c == ']':
d = '['
elif c == '}':
d = '{'
if d != stack.pop():
print("非法T_T")
break
else:
if len(stack) == 0:
print("合法^o^")
else:
print("非法T_T")
上面是小甲鱼给出的答案,我有个问题想请教一下:
for c in s:这个语句实现的是什么? 遍历字符串,通过stack里边的元素来判断当前字符是否合法 for c in s:是按顺序遍历s中的所有元素,每次取一个元素称为c的意思,其中c是中间变量的名字,只要后面统一用同一个叫啥都行。
至于这道题我个人的思路是先判断一共有多少个字符,如果为单数那肯定不匹配,如果是双数,那就用第一个和最后一个进行对应,第二个和倒数第二个对应......直到中间那对,如果有不对应的那就算不匹配,如果都对应那就算匹配,代码如下:
# 括号匹配
temp = input("请输入字符串:")
lenght = len(temp)
if((lenght%2) != 0):
flag = False
else:
flag = True
for i in range(lenght//2):
print("“%s”和“%s”匹配" % (temp, temp))
if(temp == "(" and temp == ")"):
pass
elif(temp == "[" and temp == "]"):
pass
elif(temp == "{" and temp == "}"):
pass
else:
flag = False
break
if(flag):
print("匹配")
else:
print("不匹配") def isValid(s):
for i in range(len(s)>>1):
s = s.replace('[]', '').replace('()', '').replace('{}', '')
if len(s) == 0:
return True
if len(s) != 0:
return False
s = "([)]"
print(isValid(s))輸出:False 洛阳城 发表于 2021-10-27 08:55
是按顺序遍历s中的所有元素,每次取一个元素称为c的意思,其中c是中间变量的名字,只要后面统一用同一个叫 ...
s里面的函数不是用户input进去的吗?意思是input一个就拿出来一个吗 DarcyLee 发表于 2021-10-27 23:09
s里面的函数不是用户input进去的吗?意思是input一个就拿出来一个吗
我大概是明白了,就是把用户input的字符串挨个遍历一遍是吧 傻眼貓咪 发表于 2021-10-27 09:09
輸出:
大佬,你这个代码对我现在来说属实有点超纲 大马强 发表于 2021-10-27 07:57
遍历字符串,通过stack里边的元素来判断当前字符是否合法
是遍历s里面用户输入的元素,符合条件就放进stack里面吗? DarcyLee 发表于 2021-10-27 23:27
是遍历s里面用户输入的元素,符合条件就放进stack里面吗?
这是其一:遇到{ ( [ 就放进去
其二:除 { ( [ 就要判断是否满足条件
stack.pop() 默认删除最后一位元素 如果当前stack的情况为 (({,那为了满足题目要输入 }))才行
if c == ')':
d = '('
elif c == ']':
d = '['
elif c == '}':
d = '{',
这行代码是不是把我正确答案变为{((, if d != stack.pop():然后经行判断,此时stack.pop()依次弹出的元素正是{((与转变后的一样,证明输入合法
不知道你们学了替换字符了没,replace用在这里很简单很方便,答案这是一种思路并不是唯一思路。
我敲的这个仅供参考
def isRight(s):
s = "".join({}"])
while "()" in s or "[]" in s or "{}" in s:
s = s.replace("()","").replace("[]","").replace("{}","")
return False if s else True
if __name__ == "__main__":
data = input("请输入:")
print(isRight(data))
本帖最后由 Stubborn 于 2021-10-28 23:23 编辑
DarcyLee 发表于 2021-10-27 23:25
大佬,你这个代码对我现在来说属实有点超纲
思路很简单,任意字符串,想要合法,肯定都是成对的,你把成对的操作下"{()}" -->"{}" --->"",如果最后是空字符,它一定是合法的,都被成对的处理掉,反之是非法的
做题目要有思路,然后代码化。
页:
[1]