40.百度研发笔试题
2)一串首尾相连的珠子(m 个),有N 种颜色(N<=10),
设计一个算法,取出其中一段,要求包含所有N 中颜色,并使长度最短。
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

该博客讨论了一道面试题,涉及如何在给定字符串中找到包含指定字符集的最短子串。通过使用集合(set)来跟踪已出现的字符,依次移动子串的起始和结束位置,直到集合中的字符数等于字符集大小。当找到的子串长度小于当前最小子串长度时更新结果。策略包括首尾相连和避免不必要的子串扩展。

677

被折叠的 条评论
为什么被折叠?



