一串长为M的珠子,珠子的颜色有N种(N<10)。求包含N种颜色的最短连续珠串。
//两个指针,开始的时候都指向某一个位置,移动前一个指针,直到两个指针直接包含了所有颜色的珠子。
//此时记下len。
//然后向前移动后面的指针,再调整最前面的指针,直到重新满足两个指针间包含了所有的颜色,比较此时的len和之前的len,取最小值。
//如此移动,直到后面的指针回到起始位置。
//时间复杂度是O(N),空间复杂度是O(1)
#include<iostream>
using namespace std;
void Search(char* src,char* ch)
{
int varies = 0;//多少种颜色
char* begin = src;
memset(ch, 0, sizeof(char) * 256);
while (*begin++)
{
if (ch[*begin - '0']++ == 0)
{
++varies;
}
}
//此时varies存储共有多少种颜色
int MinLength = 0;
int curLength = 0;
char* prev = src;
char* cur = src;
int curVaries = 0;
char* ret = NULL;
memset(ch, 0, sizeof(char) * 256);
while (1)
{
curLength = 0;
curVaries = 0;
cur = prev;
memset(ch, 0, sizeof(char) * 256);
while (curVaries != varies)
{
if (++ch[*cur - '0']==1)
curVaries++;
++cur;
++curLength;
if (*cur == '\0')
cur = src;
}
if (MinLength == 0 || MinLength > curLength)
{
MinLength = curLength;
ret = prev;
}
if (MinLength == varies)
break;//得到最短的
++prev;
if (*prev =='\0')
break;
}
int flag = 1;
int index = 0;
for (int i = 0; i < MinLength; ++i)
{
if (ret[i] == '\0')
flag = 0;
if (flag == 1)
ch[i] = ret[i];
else
ch[i] = src[index++];
}
ch[MinLength] = '\0';
}
void Test1()
{
char* src = "abbcdabcddddacgd";
char ch[256] = { 0 };
Search(src,ch);
cout<<ch<< endl;
}
//所得结果应该是cgdab
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。