鱼C论坛

 找回密码
 立即注册
查看: 12067|回复: 60

[技术交流] 08 - 请帮我测试字符串

[复制链接]
发表于 2021-4-23 18:19:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 鱼C-小师妹 于 2021-5-14 19:01 编辑



学习完上面的条件结构和循环结构,相信很多童鞋都和小由鱼一样都认为学编程没那么难啦~

这不小由鱼的女神又来向他求助,又到了他大展拳脚的时候咯:

小由鱼鸽鸽,遇到个棘手问题,救救孩子吧,老师留作业要写个程序判断给定的字符串 s 中括号的写法是否合法。

下面是约束条件:

  • 字符串仅包含 '('、')'、'['、']'、'{'、'}' 这三对括号的组合
  • 左右括号必须成对编写,比如 "()" 是合法的,"(" 则是非法的
  • 左右括号必须以正确的顺序闭合,比如 "{()}" 是合法的,"{(})" 则是非法的

示例:

041247nd3eiw5wav3liyvl.png.thumb.jpg

看完题目,因为学了前几讲,小由鱼很是淡定,女神这个忙,自己肯定能帮上!

不过动手实现前,还是要整理下思路!

明显这个问题就是解决括号匹配问题!

需要额外使用一个“特殊”的列表来作为临时存储。

这个列表之所以特殊,是因为我们需要:

  • 从前往后填入数据
  • 从后往前提取数据


“从前往后填入数据”这是正常行为,append() 方法即可实现;

”从后往前提取数据”听着新鲜,remove() 方法不行。

呃..

对,pop() 方法可以!

遍历给定的字符串 s 时,当遇到一个左括号时,我们会期望在后续的遍历中,有一个相同类型的右括号将其闭合。

比如 "[]" 这样。

但是,如果遇到的场景是类似 "[()]" 这种括号嵌套,也就是连续出现多个左括号,那么先出现的那个就不能急着去匹配,需要等待后面的匹配完,再轮到它。

比如 "[()]",是不是得先匹配内部的 "()",然后再匹配外部的 "[]"。

这时候,就要用到那个特殊列表。

当遇到左括号的时候,不管 3721,把它塞到特殊列表中:

042223yceyt8lsqx8ap8aa.png.thumb.png

当遇到右括号的时候,不管 7749,再特殊列表的末尾提取一个元素进行匹配。

比如 "[()]",第三个元素是 ')',从特殊列表的尾部提取出 '(',匹配成功,放行……

继续下一个 ']',此时特殊列表只剩下 '[',匹配成功,遂打印 “合法^o^”。

思路到此就很清楚啦!

从上面的思路分析,我们可以知道程序肯定要用到:循环

而循环中需要用到 break 语句,在 07 最后我们说过:

循环中如果有 continue 或 break 语句,那么就无法写成盒图。

通过上面的分析除了用到循环,还要用到多条件分支结构,那毫无疑问画成流程图最方便:

P8.jpg

流程图中会用到的 while...else... 结构相信你们懂哈。

小甲鱼老师有讲过,不懂请看最新版 P17 讲:



简单说就是:

在 for 循环完整完成后才执行 else;

如果中途从 break 跳出,则连 else 一起跳出。

好啦,流程图有了,将其翻译成代码:

游客,如果您要查看本帖隐藏内容请回复


搞定,测试下没问题!

善于观察的鱼油应该察觉到了,变量叫 “Stack”!

没错,上面的结构,就是“栈”,先记住,以后会很有用哦~

好啦,下课~

评分

参与人数 5荣誉 +26 鱼币 +11 贡献 +18 收起 理由
zhangchenyvn + 5 + 3 这个是在程序内建了个列表作为栈区?
jasley44 + 5 + 5 + 3 谢谢给差生的辅导课
不二如是 + 6 + 6 + 6 目前课程新高度
睦ちゃん她爹 + 5 + 3 鱼C有你更精彩^_^
bool想学C + 5 + 3 快讲~

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-23 18:32:51 From FishC Mobile | 显示全部楼层
这题目一点都不简单
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-23 18:48:04 | 显示全部楼层
wp231957 发表于 2021-4-23 18:32
这题目一点都不简单

我想到了之前的作业有一题是栈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-23 18:54:18 | 显示全部楼层
快讲快讲,当时就卡在这道题目
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-6 20:39:46 | 显示全部楼层
有点难
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-18 22:08:41 | 显示全部楼层
厉害
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-8 16:02:06 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-23 11:32:03 | 显示全部楼层
瞎搞版:
def KuoHao(a, b, c, d):
    if c < d:
        if temp.find(a, c, d) == -1:
            if temp.find(b, c, d) != -1:
                return 1        
        elif temp.find(b, c, d) == -1:
            return 1
        elif (temp.find(a, c, d) - temp.find(b, c, d)) % 2 == 0:
            return 1
        return KuoHao(a, b, temp.find(a, c, d) + 1, temp.find(b, c, d))
    else:
        return 0

temp = input('请输入测试字符串:')
li = list('()[]{}')
K = []
for i in range(0, 6, 2):
    K.append(KuoHao(li[i], li[i + 1], 0, len(temp)))
print('非法') if 1 in K else print('合法')
   
看了思路:
Str = input('请输入测试字符串:')
dictKH = {')': '(', ']': '[', '}': '{'}
LKH = ['(', '[', '{']
RKH = [')', ']', '}']
S = []
for i in Str:
    if i in LKH:
        S.append(i)
    elif i in RKH:
        if len(S) == 0 or S.pop() != dictKH[i]:
            print('非法')
            break
else:
    print('合法')
        

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-11 14:53:45 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-13 11:42:21 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-29 16:44:56 | 显示全部楼层
看看看看看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-12 17:15:32 | 显示全部楼层
我错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-16 14:02:27 | 显示全部楼层
s = "[]"
l = list(s)
l1 = ['{', '[', '(', ')', ']', '}']
l3 = []
for a in l:
    for i in l1:
        if a == i:
            l3.append(l1.index(i))

for i in range(len(l3)):
    if l3[i] + l3[len(l3)-i-1] == 5 and sorted(l3) == l3 and len(l3) % 2 == 0:
        print("right")
        break
    else:
        print("wrong")
        break
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-24 22:18:18 | 显示全部楼层
看看代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-8 21:45:02 | 显示全部楼层
催更
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-14 16:58:13 | 显示全部楼层
来看看python的栈有没有c++的栈的实现那么麻烦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-14 17:04:47 | 显示全部楼层
wp231957 发表于 2021-4-23 18:32
这题目一点都不简单

你去看看用c语言的栈实现这个括号匹配算法就知道什么叫做难了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-31 12:06:49 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-1 20:55:09 | 显示全部楼层
代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-6 19:26:49 | 显示全部楼层
z = input("请输入测试字符串:")
s = set(z)
c = {'(',')','[',']','{','}'}
if s.issubset(c):
    if (z.count('(') == z.count(')')) and (z.count('[') == z.count(']')) and (z.count('{') == z.count('}')):
        if ((z.index('(') + z.index(')')) % 2 != 0) or ((z.index('[') + z.index(']')) % 2 != 0) ((z.index('{') + z.index('}')) % 2 != 0):
            print('合法')
        else:
            print("非法")
    else:
        print("非法")
else:
    print("非法")
我写的好复杂啊!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 06:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表