`
piperzero
  • 浏览: 3465734 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

九度1165 字符串匹配

阅读更多
/*********************************
 *    日期:2013-1-29
 *    作者:SJF0115
 *    题号: 九度1165
 *    题目:字符串匹配
 *    来源:http://ac.jobdu.com/problem.php?pid=1165
 *    结果:AC
 *    题意:
 *    总结:1.如果匹配串中没有[],直接用strcmp比较
            2.如果匹配串中有[],先匹配[]前后字符串,再匹配[]中字符串
**********************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char c[1001][1001],temp[1001][1001],c2[1001];//temp转换为小写后的数组

//匹配串中没有[]
void allMatch(int n){
	for(int i = 0;i < n;i++){
		if(strcmp(temp[i],c2) == 0){
			printf("%d %s\n",i+1,c[i]);
		}
	}
}
//匹配串中有[]
int Match(int start,int end,int n,int index){
	int i,j,k;
	//[]前匹配
	for(i = 0,k = 0;i < strlen(c[index]) && k < start;i++,k++){
		if(temp[index][i] != c2[k]){
			return 0;
		}
	}
	//[]后匹配
	for(j = i + 1,k = end + 1;j < strlen(c[index]) && k < strlen(c2);j++,k++){ 
		if(temp[index][j] != c2[k]){
			return 0;
		}
	}
	if(j < strlen(c[index]) || k < strlen(c2)){
		return 0;
	}
	//[]中匹配
	for(j = start + 1;j < end;j++){
		if(c2[j] == temp[index][i]){
			return 1;
		}
	}
	return 0;
}
int main()
{
	int n,i,j,len;
	//freopen("C:\\Users\\SJF\\Desktop\\acm.txt","r",stdin);
	while(scanf("%d",&n)!=EOF)
	{
		//输入数据
		for(i = 0;i < n;i++){
			scanf("%s",c[i]);
			len = strlen(c[i]);
			//全部转换成小写便于匹配
			for(j = 0;j < len;j++){
				if(c[i][j] >= 'A' && c[i][j] <= 'Z'){
					temp[i][j] = c[i][j] - 'A' + 'a';
				}
				else{
					temp[i][j] = c[i][j];
				}
			}
		}
		//输入匹配串
		scanf("%s",c2);
		//全部转换成小写便于匹配,找[]下标
		int start = -1,end = -1;
		for(i = 0;i < strlen(c2);i++){
			if(c2[i] == '['){
				start = i;
			}
			else if(c2[i] == ']'){
				end = i;
			}
			if(c2[i] >= 'A' && c2[i] <= 'Z'){
				c2[i] = c2[i] - 'A' + 'a';
			}
		}
		//start = -1:匹配串中没有[]
		if(start == -1){
			allMatch(n);
		}
		else{
			for(i = 0;i < n;i++){
				if(Match(start,end,n,i)){
					printf("%d %s\n",i+1,c[i]);
				}
			}
		}
	}
	return 0;
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics