码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-04-08 01:14:26      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:字符串查找最全

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


本文出自 “小止” 博客,请务必保留此出处http://10541556.blog.51cto.com/10531556/1761464

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

标签:字符串查找最全

原文地址:http://10541556.blog.51cto.com/10531556/1761464

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!