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

看了下《编程之美》这本书,记录下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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值