编程之美-3.5最短摘要的生成

来源:互联网 发布:图像算法工程师前途 编辑:程序博客网 时间:2024/05/01 15:38

看了下《编程之美》这本书,记录下3.5节的理解。


1.题意是什么?

题目含义就是在已知字符串S1中搜索含有字符串S2的最小字符串,例如,S1="ABCDEMKFDC",S2="CDK",则应该返回“KFDC”.

“含有”意思是什么?即包含即可,不需要相同顺序。

原书写的有点拗口,其实对于关键字“微软亚洲研究院  使命”而言,最短摘要为“微软亚洲研究院成立于1998年,我们的使命”。一开始误以为网页返回的都是最短摘要了。


2.原书给出的代码不全,特此补全

解释下:

1)两个指针指向原字符串,两个指针指向最终生成的字符串

2)一开始先设定S1的长度为最小值,后来一旦包含“关键字字符串”,即计算长度,发现新长度比原来设定的小,即保存下来。

<span style="font-size:14px;">#include <iostream>#include <string>#include <algorithm>using namespace std;bool isAllExisted(string s1, string s2);string MinStr(string s1,string s2){int nlen = s1.length();int pBegin = 0;int pEnd = 0;int resBegin = 0;int resEnd = 0;while (1){while (pEnd < s1.length() && !isAllExisted(s1.substr(pBegin, pEnd - pBegin + 1), s2)){pEnd++;}while (isAllExisted(s1.substr(pBegin, pEnd - pBegin + 1), s2)){if (pEnd - pBegin+1 < nlen){nlen = pEnd - pBegin + 1;resBegin = pBegin;resEnd = pEnd;}pBegin++;}if (pEnd >= s1.length()){break;}}//cout << resBegin << resEnd << endl;return s1.substr(resBegin,resEnd-resBegin+1);}bool isAllExisted(string s1, string s2){string s(s1);for (int i = 0; i < s2.size();++i){if (find(s.begin(), s.end(), s2[i]) == s.end())return 0;else{s.erase(find(s.begin(), s.end(), s2[i]));}}return 1;}int main(int argc, char *argv[]){string s1 = "1234522637";string s2 = "232";string res = MinStr(s1,s2);cout << res << endl;return 0;}</span>

0 0
原创粉丝点击