ARTS-第5周-190415

本文深入探讨了正则表达式匹配算法的实现,重点讲解了如何处理'.'和'*'字符,通过递归方法解决了复杂的匹配问题。文章提供了详细的代码示例和测试用例,帮助读者理解正则表达式的匹配逻辑。

Algorithm
Regular Expression Matching

Given an input string (s) and a pattern (p), implement regular expression matching with support for '.' and '*'.

'.' Matches any single character.
'*' Matches zero or more of the preceding element.
The matching should cover the entire input string (not partial).

Note:

s could be empty and contains only lowercase letters a-z.
p could be empty and contains only lowercase letters a-z, and characters like . or *.
Example 1:

Input:
s = "aa"
p = "a"
Output: false
Explanation: "a" does not match the entire string "aa".
Example 2:

Input:
s = "aa"
p = "a*"
Output: true
Explanation: '*' means zero or more of the precedeng element, 'a'. Therefore, by repeating 'a' once, it becomes "aa".
Example 3:

Input:
s = "ab"
p = ".*"
Output: true
Explanation: ".*" means "zero or more (*) of any character (.)".
Example 4:

Input:
s = "aab"
p = "c*a*b"
Output: true
Explanation: c can be repeated 0 times, a can be repeated 1 time. Therefore it matches "aab".
Example 5:

Input:
s = "mississippi"
p = "mis*is*p*."
Output: false

主要是实现正则表达式中的 “.” 和 ‘*’,还是最简单的,最开始写了一个版本代码,发现有一种情况没能考虑进去。(直接用正则表达式的解决方法就不讨论了)
input:
s = “aaaabcd”
p = “a*aacd”
输出: true
当*表达式出现的时候,如果后面链接的匹配字符串和*前面的字符串一致的时候,需要在之前匹配完成字符串中重复检查是否匹配。
当匹配a*是,已经遍历了字符串 aaaa,当检测新的匹配字段a,就需要在aaaa中检测是否匹配,当检测第三个a时还需要在aaaa字段中继续检测是否匹配,知道检测b字符时才继续往前推进。
还有一种情况:
input:
s = “aaaabcdabcd”
p = “.*abcd”
或 p = “.*abcda*abcda*”
输出: true
所以没那么简单,看了网站上的解决方法,思路是递归。继续完善解决方案。
分为两种情况:

  • 匹配字符串中没有*,直接按照每位进行匹配。

  • 如果遇到带*的匹配串:那么匹配字符串的有效位数就是两位例如a*,例如
    s = “aaa”
    p = “a*a”
    递归过程:

  • p去掉带a*,s=“aaa” p=“a” 结果 为false 或者 s=“aa” p=“a*a” 结果为(不能直接判断,递归);

  • p去掉带a*,s=“aa” p=“a” 结果 为false 或者 s=“a” p=“a*a” 结果为(不能直接判断,递归);

  • p去掉带a*,s=“a” p=“a” 结果 为true 返回成功。

代码实现的时候没能一次成功,记录下几个测试用例:

Solution.IsMatch("bbbba", ".*a*a");//true
Solution.IsMatch("aaa", "a*a");//true
Solution.IsMatch("abcd", "d*");//false
Solution.IsMatch("mississippi", "mis*is*p*.");//false
Solution.IsMatch("mississippi", "mis*is*ip*.");//true

实现代码,执行的速度感觉还有优化的空间:

static public bool IsMatch(string s, string p)
        {
            //Console.WriteLine("IsMatch:{0},{1}", s, p);//方便检查递归过程
            if (s.Length == 0)
            {
                if (p.Length == 0)
                {
                    return true;
                }
                else if (p.Length == 1)
                {
                    return false;
                }
                else
                {
                    if (p[1] == '*')
                    {
                        return IsMatch(s,p.Substring(2));
                    }
                    else
                    {
                        return false;
                    }
                }
            }
            else
            {
                if (p.Length == 0)
                {
                    return false;
                }
                else if (p.Length == 1)
                {
                    if (s[0] == p[0] || p[0]=='.')
                    {
                        return IsMatch(s.Substring(1), p.Substring(1));
                    }
                    else
                    {
                        return false;
                    }
                }
                else
                {
                    if (p[1] == '*')
                    {
                        if (s[0] == p[0] || p[0] == '.')
                        {
                            return IsMatch(s.Substring(1), p)|| IsMatch(s, p.Substring(2));
                        }
                        else
                        {
                            return IsMatch(s, p.Substring(2));
                        }
                    }
                    else if(s[0] == p[0] || p[0] == '.')
                    {
                        return IsMatch(s.Substring(1), p.Substring(1));
                    }
                    else
                    {
                        return false;
                    }
                }
            }
        }

思路很重要,实现的时候对各种情况都要仔细考虑。

Review
左耳朵耗子:996不是福气,努力也未必成功
https://mp.weixin.qq.com/s/hD05BHMXkaLaaeFR3thhhg
看了这篇文章还是很有感触的,先摘录一些文章中的观点

“努力就会成功”这句话,把“努力”说成了“成功”的充要条件,这不就是错的吗?努力只是成功的必要条件之一。
因为这类人基本上都是能力有限,不知道怎么提升自己的人,当他们看到只要拼命使力就可以成功的观点时,他们就会有共鸣,就会感到,不用学习那些晦涩难懂高级的知识,不用掌握和练习哪些高级技能,自己只需要在低级的事情上拼命和努力,加更多的班和干更多活,自己就会像电影中的那些小人物一样,总有一天会成功的……
“努力就会成功,勤劳就会致富”,不但符合那些低级管理者的利益诉求,同样符合那些能力不足不愿意学习和成长的人的诉求。因为,他们混淆了行动与进展,忙碌与多产,他们以为能靠蛮力可以弥补思维上的惰性,靠拼命可以弥补能力上的不足……

文章中有介绍作者的个人工作经历,对于我这种一般人来说还是很羡慕的,能到大的公司,能遇到好的学习对象,当然个人能力还是很强的。我这种一毕业就按部就班找工作,也没到什么大公司,至少没接触到大的项目,有时候看到分享的那些都看不懂的技术,更多的是在感慨没那么多机会,也就有了学习焦虑,什么都想学,很多学了也用不上,只能是了解的多一点。
韩寒在电影《后会无期》中提到:我们听过很多道理,却仍过不好这一生。改编一下,看了那么多技术文章也没能找个更好的工作或者目标。当然我还是比较乐观的人,还会继续坚持学习就当是养成个习惯吧,哪怕最后还是在默默无闻的工作和养家糊口。
996是个比较火的话题,有的公司加班是比较多,工作压力是比较大。身体还是重要的,在健康的状态下有目标的拼搏还是很幸福的。试想一下,每天的工作就是简单的重复修bug,也不是很忙,工资也一般,公司也没有新的项目需要你去研究,自己学习也没有方向,想参加个开源项目也没有目标,也是件无趣的事情。努力是必要的条件,996不是吧,有些996的人也在混日子。

Tips&Share
整理了一下以前分享的文章:Docker初学_php-nginx-mysql
https://blog.youkuaiyun.com/sleepingboy888/article/details/80390953

(1)普通用户端(全平台) 音乐播放核心体验: 个性化首页:基于 “听歌历史 + 收藏偏好” 展示 “推荐歌单(每日 30 首)、新歌速递、相似曲风推荐”,支持按 “场景(通勤 / 学习 / 运动)” 切换推荐维度。 播放页功能:支持 “无损音质切换、倍速播放(0.5x-2.0x)、定时关闭、歌词逐句滚动”,提供 “沉浸式全屏模式”(隐藏冗余控件,突出歌词与专辑封面)。 多端同步:自动同步 “播放进度、收藏列表、歌单” 至所有登录设备(如手机暂停后,电脑端打开可继续播放)。 音乐发现与管理: 智能搜索:支持 “歌曲名 / 歌手 / 歌词片段” 搜索,提供 “模糊匹配(如输入‘晴天’联想‘杰伦 - 晴天’)、热门搜索词推荐”,结果按 “热度 / 匹配度” 排序。 歌单管理:创建 “公开 / 私有 / 加密” 歌单,支持 “批量添加歌曲、拖拽排序、一键分享到社交平台”,系统自动生成 “歌单封面(基于歌曲风格配色)”。 音乐分类浏览:按 “曲风(流行 / 摇滚 / 古典)、语言(国语 / 英语 / 日语)、年代(80 后经典 / 2023 新歌)” 分层浏览,每个分类页展示 “TOP50 榜单”。 社交互动功能: 动态广场:查看 “关注的用户 / 音乐人发布的动态(如‘分享新歌感受’)、好友正在听的歌曲”,支持 “点赞 / 评论 / 转发”,可直接点击动态中的歌曲播放。 听歌排行:个人页展示 “本听歌 TOP10、累计听歌时长”,平台定期生成 “全球 / 好友榜”(如 “好友中你本听歌时长排名第 3”)。 音乐圈:加入 “特定曲风圈子(如‘古典音乐爱好者’)”,参与 “话题讨论(如‘你心中最经典的钢琴曲’)、线上歌单共创”。 (2)音乐人端(创作者中心) 作品管理: 音乐上传:支持 “无损音频(FLAC/WAV)+ 歌词文件(LRC)+ 专辑封面” 上传,填写 “歌曲信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值