求包含字符集的最小子串

该博客讨论了一道面试题,涉及如何在给定字符串中找到包含指定字符集的最短子串。通过使用集合(set)来跟踪已出现的字符,依次移动子串的起始和结束位置,直到集合中的字符数等于字符集大小。当找到的子串长度小于当前最小子串长度时更新结果。策略包括首尾相连和避免不必要的子串扩展。
40.百度研发笔试题
 2)一串首尾相连的珠子(m 个),有N 种颜色(N<=10),
设计一个算法,取出其中一段,要求包含所有N 中颜色,并使长度最短。

并分析时间复杂度与空间复杂度。

题目来源:
微软等公司数据结构+算法面试100 题V0.1 版
http://topic.csdn.net/u/20101126/10/b4f12a00-6280-492f-b785-cb6835a63dc9.html

分析:

等效为有一个长度为m的字符串,有容量为N的字符集{a,b,c...}构成,求包含字符集的最小子串。

使用set来保存已经存在的字符。

顺序移动子串的开始位置,将set清空,移动子串的结束位置,并将字符加入set,直至set中元素个数为N,表明当前子串已经包含完整字符集;

注意首尾相连,子串结束位置移动到最后后要折回。当子串长度大于当前已知最小长度时,就没必要继续向后移动了,可以直接移动子串的开始位置。

string FindMinSet(const string &str,const set<char> &cset)
{
	cout<<str<<endl;
	string res;
	int str_len=str.length();
	int set_size=cset.size();
	if (str_len<set_size)
		return res;
	int minlen=str_len;
	int besti=0,bestj=0;
	for (int i=0;i<str_len;i++)
	{
		set<char> tempset;
		tempset.clear();
		t
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值