字符串匹配

原创 2012年03月29日 20:03:13
题目描述:

    读入数据string[ ],然后读入一个短字符串。要求查找string[ ]中和短字符串的所有匹配,输出行号、匹配字符串。匹配时不区分大小写,并且可以有一个用中括号表示的模式匹配。如“aa[123]bb”,就是说aa1bb、aa2bb、aa3bb都算匹配。

输入:

输入有多组数据。
每组数据第一行输入n(1<=n<=1000),从第二行开始输入n个字符串(不含空格),接下来输入一个匹配字符串。

输出:

输出匹配到的字符串的行号和该字符串(匹配时不区分大小写)。

样例输入:
4
Aab
a2B
ab
ABB
a[a2b]b
样例输出:
1 Aab
2 a2B
4 ABB
来源:
2008年北京航空航天大学计算机研究生机试真题

实现代码:

#include<stdio.h>
#include<malloc.h>

#define MAX_LENGTH  20

static int Isup(char ch)  //是否是大写字母
{
	if(ch>='A'&&ch<='Z')
		return 1;
	else
		return 0;
}

static int Islow(char ch)  //是否是小写字母
{
	if(ch>='a'&&ch<='z')
		return 1;
	else
		return 0;
}

static int Is_equ(char ch1,char ch2)  //判断两个字符是否相等,若是字母则忽略大小写
{
	if(Isup(ch1)&&Islow(ch2)&&(ch2==ch1+32))
		return 1;
	if(Isup(ch2)&&Islow(ch1)&&(ch1==ch2+32))
		return 1;
	if(ch1==ch2)
		return 1;
	return 0;
}

int main(void)
{
	char **str;   //str待匹配的多个字符串
	char *pattern;  //pattern匹配的字符串
	int num,i,j,k;
	scanf("%d",&num);
	str = (char **)malloc(num*sizeof(char *));
	for(i=0;i<num;i++)
	{
		str[i]=(char *)malloc(MAX_LENGTH*sizeof(char));
		scanf("%s",str[i]);
	}
	
	pattern = (char *)malloc(MAX_LENGTH*sizeof(char));
	scanf("%s",pattern);
	
	for (i=0;i<num;i++)
	{
		j = 0;
		k = 0;
		while (str[i][j])
		{
			if (pattern[k]=='[')
			{
				while (pattern[++k]!=']') //直到在[]内找到一个字符与str[i][j]相等或到']'
				{
					if(Is_equ(pattern[k],str[i][j]))
						break;
				}
				
				if (pattern[k]==']')  //pattern的[]内没有一个字符与str[i][j]匹配
					break;
				else //pattern的[]内有一个字符与str[i][j]匹配
				{
					while (pattern[++k]!=']'); //移动k,使下次比较']'后面的第一个字符
				}
			}
			else
			{
				if (!Is_equ(pattern[k],str[i][j])) //[]外只要有一个字符不匹配,整个串不匹配
					break;				
			}
			
			k++;
			j++;
		}
		
		if(!str[i][j]&&!pattern[k]) //都同时达到串的末尾,说明整个串匹配成功,输出
			printf("%d %s\n",i+1,str[i]);
	}

	for(i=0;i<num;i++)
		free(str[i]);
	free(str);
	free(pattern);

	return 0;
	
}

常见算法及问题场景——字符串匹配

思路字符串匹配的思路大致分几种: 1、暴力匹配。 2、基于暴力匹配进行优化。进行预计算,一旦发现失败匹配之后,可以跳过更多的位置,减少无谓的浪费。 这篇文档提到了许多按这个思路实现的算法各具特点...
  • a345017062
  • a345017062
  • 2016年09月06日 19:17
  • 962

几种常见的字符串匹配算法

转自http://www.360doc.com/content/14/0325/15/15064667_363609292.shtml 1. 朴素算法 朴素算法是最简单的字符串匹配算法,也是人们接触得...
  • qingkongyeyue
  • qingkongyeyue
  • 2016年12月05日 13:24
  • 1084

[算法系列之十二]字符串匹配之蛮力匹配

引言字符串匹配是数据库开发和文字处理软件的关键。幸运的是所有现代编程语言和字符串库函数,帮助我们的日常工作。不过理解他们的原理还是比较重要的。字符串算法主要可以分为几类。字符串匹配就是其中之一。当我们...
  • SunnyYoona
  • SunnyYoona
  • 2015年02月05日 20:46
  • 3115

js判断字符串的匹配方法

match 方法 使用正则表达式模式对字符串执行查找,并将包含查找的结果作为数组返回。 stringObj.match(rgExp) 参数 stringObj 必选项。对其进行查找...
  • anbowing
  • anbowing
  • 2014年01月14日 15:26
  • 9612

几个高效的字符串匹配算法

在写这篇之前,我一定要说,我讨厌KMP算法!!!所以我是不会讲解KMP算法的!!! 好了,开始。 1 Horspool算法 Horspool 算法的思想很简单的。创新之处是模式串是从右向左进...
  • lianhuijuan
  • lianhuijuan
  • 2017年03月12日 14:07
  • 828

【Java编程】Java中的字符串匹配

在Java中,字符串的匹配可以使用下面两种方法:         1、使用正则表达式判断字符串匹配         2、使用Pattern类和Matcher类判断字符串匹配 正则表达式的字...
  • tengweitw
  • tengweitw
  • 2014年04月29日 17:07
  • 2969

Python 正则表达式 字符串的匹配、替换、分割、查找

1、search(pattern, string, flags=0)      在一个字符串中查找匹配 2、findall(pattern, string ,flags=0)     找到匹配,返回...
  • u011138533
  • u011138533
  • 2017年03月17日 21:26
  • 5512

汇编字符串匹配实验

今天调试汇编程序,要求是输入一个关键字,再输入一句话,如果这句话里面含有这个关键字返回match,没有这句话返回no match。在机子上做了好久好久,都因体力不支而放弃,今天我尝试先看懂网上相关的程...
  • u010009169
  • u010009169
  • 2013年11月29日 21:04
  • 1045

字符串匹配算法总结 (分析及Java实现)

字符串模式匹配算法(string searching/matching algorithms) 顾名思义,就是在一个文本或者较长的一段字符串中,找出一个或多个指定字符串(Pattern),并返回其...
  • chndata
  • chndata
  • 2015年02月13日 10:58
  • 13037

算法导论-字符串匹配

编辑文本时,我们经常需要在文本中找到某串模式字符在整个文本中出现的位置,这个模式字符串即为用户查找输入的关键字,解决这个问题的算法为字符串匹配算法。 当我们遇到这个问题,如何查找在文本中出现的...
  • u011467044
  • u011467044
  • 2017年02月12日 23:21
  • 1160
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:字符串匹配
举报原因:
原因补充:

(最多只允许输入30个字)