一串长为M的珠子,珠子的颜色有N种(N<10)。求包含N种颜色的最短连续珠串。
十载的福建网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。营销型网站的优势是能够根据用户设备显示端的尺寸不同,自动调整福建建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联从事“福建网站设计”,“福建网站推广”以来,每个客户项目都认真落实执行。
//两个指针,开始的时候都指向某一个位置,移动前一个指针,直到两个指针直接包含了所有颜色的珠子。
//此时记下len。
//然后向前移动后面的指针,再调整最前面的指针,直到重新满足两个指针间包含了所有的颜色,比较此时的len和之前的len,取最小值。
//如此移动,直到后面的指针回到起始位置。
//时间复杂度是O(N),空间复杂度是O(1)
#includeusing 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<
分享名称:字符串匹配之通配符问题-
本文来源:http://cdxtjz.cn/article/popdih.html