字符串匹配之通配符问题-

发布时间:2020-07-31 23:10:30 作者:小止1995
来源:网络 阅读:677

一串长为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


推荐阅读:
  1. Oralce菜鸟学习之 通配符%和_的使用
  2. 文件通配符

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

字符 最全 串查

上一篇:破解强引用循环

下一篇:Android日志:Google官方下拉刷新控件

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》