题目:一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。并分析时间复杂度与空间复杂度。
思路就是下面的:
两个指针,一个指针走,记录走过多少个颜色,如果n个颜色都有了,就走第二个指针。每次第一个指针停止的时候就记录长度。等到第一个指针走过m了话,就扫描一遍了。复杂度O(m)
之前有个在一串字符中只有abcd,找出全包含的最短sub字符串,一个想法
//定义珠子
struct TYPE
{
string color;
};
TYPE zhuzi[];
#define T TYPE
struct Result
{
T *pstart; //存放开始的位置
T *pend; //存放结束的位置
int m_Length; //存放字符串长度
};
Result Temp; //暂存找到的字符串
Result MinResult; //长度最小的字符串
void InitStruct(Result a)
{
a.m_Length=0;
a.pend=a.pstart=NULL;
}
//初始化两个结构体
InitStruct(Temp);
InitStruct(MinResult);
MinResult.m_Length=10000000; //它的长度可以先定义一个足够大的数据,便于进行比较
//珠子的信息采用T类型的数组来存储,其内容是存放的每一个珠子的颜色
void SearchFunc(T zhuzi[])
{
T *p1,*p2;
p1=p2=NULL;
bool red_appear,black_appear,yellow_appear;
red_appear=black_appear=yellow_appear=false;
int i;
int nCount=0; //记录目标颜色珠子出现的次数
for (i=0,p1=zuzi;i<zuzi.length();p2=p1,p1++,i++)
{
if (*p2=="red"&&red_appear==false)
{
nCount+=1;
red_appear==true;
}
else if(red_appear==true)
{
break; //去执行下一次循环
}
if (*p2=="black"&&black_appear==false)
{
nCount+=1;
black_appear=true;
}
else if(black_appear==true)
{
break;
}
if (*p2=="yellow"&&yellow_appear==false)
{
nCount+=1;
yellow_appear=true;
}
else if(yellow_appear==true)
{
break;
}
//判断是否已经找到所有的目标颜色的珠子
if (nCount==3)
{
Temp.pstart=p1;
Temp.pend=p2;
Temp.m_Length=p2-p1;
if (Temp.m_Length<MinResult.m_Length)
{
MinResult=Temp;
}
}
}
}