题外话:很多年前碰到的一道题了,那时候不会做,今天看《编程之美》的时候看到那篇算字符串相似度的题的时候,想到也应该来做一下那时没做出来的题了,而且计算字符串相似度的算法也正好可以用在那道题上。
原题是什么我已经不记得了,反正就当我做的一道思考题吧:
题目:读取字符串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()函数即可,贴代码咯,其实换汤不换药啦。