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

本文解析了在已知字符串S1中搜索包含指定字符串S2所有字符的最短子串问题,并提供了一段C++实现代码。通过双指针技巧,算法能够有效地找到满足条件的最小子串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


1.题意是什么?

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

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

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


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

解释下:

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

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

#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;
}

板长四十二宽三十四里面是针脚点,针脚位置是lue B Net F92(04A067) -10.734 -148.339 04A067 -10.734 -148.339 Blue B Net T76(04A066) -91.001 14 04A066 -91.001 14 Blue B Net F44(04A064) 47.506 -99.786 04A064 47.506 -99.786 Blue B Net F28(04A063) -5.052 -1.356 04A063 -5.052 -1.356 Blue B Net F12(04A062) 35.09 -39.883 04A062 35.09 -39.883 Blue B Net F123(04A059) 34.806 4.925 04A059 34.806 4.925 Blue B Net T107(04A058) -118.999 10.5 04A058 -118.999 10.5 Blue B Net T91(04A057) -101.501 10.5 04A057 -101.501 10.5 Blue B Net T75(04A056) -94.501 14 04A056 -94.501 14 Blue B Net T43(04A054) -125.999 14 04A054 -125.999 14 Blue B Net F27(04A053) 58.682 -139.068 04A053 58.682 -139.068 Blue B Net F11(04A052) -14.242 4.402 04A052 -14.242 4.402 Blue B Net T122(04A049) -143.5 10.5 04A049 -143.5 10.5 Blue B Net T106(04A048) -115.499 10.5 04A048 -115.499 10.5 Blue B Net T90(04A047) -98.001 10.5 04A047 -98.001 10.5 Blue B Net F74(04A046) 38.42 -140.998 04A046 38.42 -140.998 Blue B Net T58(04A045) -111.999 14 04A045 -111.999 14 Blue B Net F42(04A044) 47.353 -140.084 04A044 47.353 -140.084 Blue B Net F26(04A043) 72.967 8.786 04A043 72.967 8.786 Blue B Net F10(04A042) 68.613 6.652 04A042 68.613 6.652 Blue B Net F121(04A039) 37.32 1.496 04A039 37.32 1.496 Blue B Net T105(04A038) -111.999 10.5 04A038 -111.999 10.5 Blue B Net T89(04A037) -94.501 10.5 04A037 -94.501 10.5 Blue B Net F73(04A036) -3.782 -1.737 04A036 -3.782 -1.737 Blue B Net F57(04A035) 60.416 -148.085 04A035 60.416 -148.085 Blue B Net T41(04A034) -129.499 14 04A034 -129.499 14 Blue B Net T25(04A033) -147 14 04A033 -147 14 Blue B Net T9(04A032) -150.5 14 04A032 -150.5 14 Blue B Net T3963(04A029) -125.999 -7 04A029 -125.999 -7 Blue B Net T3947(04A028) -147 -7 04A028 -147 -7 Blue B Net T3931(04A027) -136.5 -3.5 04A027 -136.5 -3.5 Blue B Net T3915(04A026) -118.999 -3.5 04A026 -118.999 -3.5 Blue B Net T3899(04A025) -91.001 -3.5 04A025 -91.001 -3.5 Blue B Net F3883(04A024) 52.814 -3.178 04A024 52.814 -3.178 Blue B Net F3867(04A023) 8.821 -158.93 04A023 8.821 -158.93 Blue B Net F3851(04A022) 18.669 -9.291 04A022 18.669 -9.291 Blue B Net T3962(04A019) -129.499 -7 04A019 -129.499 -7类似这样的,我应该怎么计算才能把我提供的针脚位置点完
最新发布
03-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值