一道关于字符串匹配的思考题

题外话:很多年前碰到的一道题了,那时候不会做,今天看《编程之美》的时候看到那篇算字符串相似度的题的时候,想到也应该来做一下那时没做出来的题了,而且计算字符串相似度的算法也正好可以用在那道题上。

原题是什么我已经不记得了,反正就当我做的一道思考题吧:

 

题目:读取字符串s1和s2,其中s1是正常的单词,而s2中可能包含'?'和'*'

s2中的'?'代表任意一个字符,'*'代表任意n个字符(我这里假设n>=1),比较s1和s2,检查他们是否匹配。

 

算法思路:比方说,对s1[0,....m],s2[0,...k],首先比较s1[0]和s2[0]是否相等,如果相等或者s2[0]是'?',那么就进一步比较s1[1,...m]和s2[1,...k],这样依次下去。另一方面,如果s[i]和s2[j]不相等,且s2[j]不是'?'或'*',那么就说明不匹配了。如果s2[j]是'*'的话,就说明*号代表1-n个字符,我们先假设*号代表1个字符,那么查看剩下的s1和s2能不能匹配,不能就假设*号代表2个字符,再依次类推,一旦找到一个能匹配,就成功了,如果一直到最后都没找到,就失败了,(其实,*号顶多代表(send-sbegin)-(pend-pbegin)个字符)。当然,还要考虑2个特殊情况,就是sbegin=send,和pbegin=pend,就是说检查到最后了,然后也是按照之前的匹配方法来判断一下,返回一个值就行了。整体来说,就是用到了递归了。

 

唉,思路写得比较乱,上代码了:

 

 

我尝试了一些字符串,测试的都还挺成功的,可能还会有bug,欢迎大家指出!:)

 

继续修改,把题目修改成:

假设有两个文件hello.txt和hello2.txt,hello.txt中存放的是正常的单词,hello2.txt中存放的是带?和*的单词,现在要用hello2.txt中与hello.txt对应的单词匹配的字符串来替换掉hello.txt,假设替换的结果输出到world.txt,且hello.txt和hello2.txt中一个单词一行。

那么我们事实上只需要修改main()函数即可,贴代码咯,其实换汤不换药啦。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值