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

一串长为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
时间: 2024-10-13 23:03:56

字符串匹配之通配符问题-的相关文章

动态规划 | 带有通配符的字符串匹配(浅显易懂)

带有通配符的字符串匹配 一.Leetcode | 44 Wildcard Matching(只有一个字符串包含通配符) 题目很简单,就是说两个字符串,一个含有通配符,去匹配另一个字符串:输出两个字符串是否一致. 注意:'?'表示匹配任意一个字符,'*'表示匹配任意字符0或者多次 首先,我们想到暴力破解.如果从头到尾的破解,到第二个字符时,是否匹配成功取决于第一个字符是否匹配成功! 所以我们想到应该要用到动态规划: 既然用到动态规划,最重要的是设置初值 和找到递推式: 于是,我们开始分析初值怎么设

含有通配符的字符串匹配

字符串匹配问题,给定两个字符串.求字符串2.在字符串1中的最先匹配结果.字符串2中能够存在'*'符号,且该符号能够代表随意字符,即字符串2中存在通配符. e.g. 输入:abcdefghabef, a*f 输出:abcdef #include <iostream> #include <string> using namespace std; bool Match(const string &s1,const string &s2,string &result

COJN 0558 800600带通配符的字符串匹配

800600带通配符的字符串匹配 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 通配符是一类键盘字符,当我们不知道真正字符或者不想键入完整名字时,常常使用通配符代替一个或多个真正字符.通配符有问号(?)和星号(*)等,其中,“?”可以代替一个字符,而“*”可以代替零个或多个字符.你的任务是,给出一个带有通配符的字符串和一个不带通配符的字符串,判断他们是否能够匹配.例如,1?456 可以匹配 12456.13456.1a45

[OpenJudge]带有通配符的字符串匹配

#include <iostream> #include <stdlib.h> #include <string.h> using namespace std; /* 字符串匹配 ?代表一个字符(不能没有),*可以代表任意多个字符(可以为空) ?表示任意字符,也就是说?永远可以匹配成功,本质上,只要遇到?就一定匹配 *的本质,是分割字符串,即如果P=P1*P2,即P得匹配条件是匹配P1串之后,再匹配P2子串 */ //@param  src[], 带匹配的字符串 //@

正则表达式的使用,字符串提取,字符串匹配(C#语言)

在程序中常常设计字符串的处理,比如①:判断用户的输入字符串是否符合要求,是否是非法字符串,②:取出一个很复杂字符串的某一程序中需要的部分等 这事用自己写算法判断通常是十分困难的,所以遇到字符串的处理时要很快想到用正则表达式. 一:正则表达式元字符 •要想学会正则表达式,理解元字符是一个必须攻克的难关.不用刻意记 •.:匹配任何单个字符.例如正则表达式“b.g”能匹配如下字符串:“big”.“bug”.“b g”,但是不匹配“buug”,“b..g”可以匹配“buug”. •[ ] :匹配括号中的

FFT字符串匹配

本文半原创 参考资料:其实就是照抄的什么参考啊 我们知道KMP可以用来在线性复杂度内进行制胡窜匹配 今天教您一种新方法:用FFT进行字符串匹配 您可能觉得这很玄学,FFT不是做多项式卷积的吗,怎么还可以做制胡窜匹配 您先别着急,请接着听 我们设两个字符串--模式串\(a\),长度为\(m\),文本串\(b\),长度为\(n\).设下标为从0开始 定义函数\(a(i)\)返回a串位置i的字符,\(b(i)\)返回b串位置i的字符(其实就是下标) 定义匹配函数\(c(x,y)=a(x)-b(y)\)

uva:10340 - All in All(字符串匹配)

题目:10340 - All in All 题目大意:给出字符串s和t,问s是否是t的子串.s若去掉某些字符能和t一样,那么t是s的子串. 解题思路:匹配字符.t的每个字符和s中的字符匹配.注意这里的字符数组大小要开大点. 代码: #include <stdio.h> #include <string.h> const int N = 1000005; char s[N], t[N]; bool match () { int i = 0; int lens = strlen(s);

CCF 字符串匹配

问题描述 试题编号: 201409-3 试题名称: 字符串匹配 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行.你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符:当选项关闭时,表示同一个字母的大写和小写看作相同的字符. 输入格式 输入的第一行包含一个字符串S,由大小写英文字母组成. 第二行包含一个数字,表示大小写敏感的选项,当数字为0时表示大小写不敏感,当数字为1时表示大小

字符串匹配的KMP算法

html, body { font-size: 15px; } body { font-family: Helvetica, "Hiragino Sans GB", 微软雅黑, "Microsoft YaHei UI", SimSun, SimHei, arial, sans-serif; line-height: 1.6; color: ; background-color: ; margin: 0; padding: 16px 20px; } h1, h2, h