user-0 提问: 您懂这个嘛 “模式匹配”

回复:
user: user-1
content: 引用 1 楼 taodm 的回复:刚接触编程的还是放弃吧。这题至少要1年以后再试了。 也不一定，因为作业中没规定时间复杂度。。。

user: user-2
content: 刚接触编程的还是放弃吧。这题至少要1年以后再试了。

user: user-3
content: 不能给你全做，否则起不到锻炼作用，下面代码是两个字符串匹配，供参考，不懂拍我，我可以给你讲解！   int main(void) { 	size_t i = 0, j = 0; 	char str1[128] = {0}; 	char str2[128] = {0}; 	gets(str1); 	gets(str2);  	while(i < strlen(str1) - strlen(str2) + 1) 	{ 		while (j < strlen(str2)) 		{ 			if (str1[i] != str2[j]) 			{ 				i -= j - 1; 				j = 0; 				break; 			} 			++i; 			++j; 		} 		if (j == strlen(str2)) 		{ 			printf("%d\n", i - j); 			break; 		} 	}  	return 0;  }

user: user-4
content: 21行前用c++中string的find做的。。比较方便。

user: user-4
content: 写了两种方式的c++和c的。  #include<iostream> #include<string> using namespace std;   int main() {    string a,b;    int p[100];    int max,i;    cin>>max;    for(i=0;i!=max;i++)    { 	   cin>>a; 	   cin>>b; 	   size_t l=a.find(b);        p[i]=(l==string::npos)?-1:l;    }    for(i=0;i!=max;i++) 	   cout<<p[i]<<endl;    return 0; }     #include<stdio.h> #define max 100 int judge(char *a,char *b)//b在a中是否出现，返回位置或-1 { 	int temp; 	char *p1=a,*p2=b; 	while(*p1!='\0')			//从p1头开始找 	{ 		temp=0; 		while(*p1!=*p2)			//试图找到p1和p2开头一样的地方 		{ 			if(*p1=='\0')		//如果找到尾部也没发现和p2开一样的地方，则返回-1 				return -1; 			p1++;				//p1一直向后 		} 		temp=p1-a;				//找到p1和p2开头一样地方，记录下位置  		while(*p2!='\0')		//开始进行对比 		{ 			if(*p1=='\0')		//如果找到p1尾还没对比完的话，返回-1	 				return -1;		 			if(*p1!=*p2)		//如果发现不一样的地方，跳出，继续找p1和p2头相同的地方 			{ 				break; 			} 			else  				if(*(p2+1)=='\0')		//如果对比完都一样的话返回位置 					return temp; 			p1++; 			p2++; 		} 		p1=&a[temp+1];			//p1到刚刚记录的temp的位置后面一个 		p2=b;					//p2回到头部 	}   	return -1; }  int main() { 	char a[max],b[max]; 	int p[100]; 	int m,i; 	scanf("%d",&m); 	for(i=0;i!=m;i++) 	{ 		scanf("%s%s",&a,&b); 		p[i]=judge(a,b); 	} 	for(i=0;i!=m;i++) 	{ 		printf("%d\n",p[i]); 	} }

user: user-5
content: 如果匹配的字符串是如同485通讯一样，一个一个字节或者连续几个字节的来，来一次匹配一次的话，那的确是麻烦。 但这里字符串是一次性输入的，这倒简单： #include <stdio.h> #include <string.h> #include <stddef.h>  int AnalysisStr(char const *pStrS, char const  *pStrP) {     char Count = 0;     char const *pStrSTmp = pStrS;     char const *pStrPTmp = pStrP;     if(strlen(pStrS) < strlen(pStrP)) {/*字符串S长度短于P肯定错误*/         return -1;     }     for(Count = 0; Count <= strlen(pStrS) - strlen(pStrP); Count++)     {         pStrSTmp = pStrS + Count;         pStrPTmp = pStrP;         /*对比两字符串中的元素，直到字符串P结束或者不相等*/         while( (*pStrPTmp != '\0') && (*pStrPTmp == *pStrSTmp) ) {             pStrPTmp++;             pStrSTmp++;         }         /* *pStrPTmp == '\0'说明全部相同*/         if(*pStrPTmp == '\0'){             return (int)Count;         }     }     return -1;/*没找到*/ }  #define N 3 typedef struct MatchTag{     char p[128];     char s[128]; } Match_t; void PatternMatch(void) {     Match_t MatchTbl[N];      char count = 0;     printf("样例输入\n");     /*输入三组数组*/     for(count = 0; count < N; count++)     {         scanf("%s", MatchTbl[count].s);         scanf("%s", MatchTbl[count].p);     }     printf("样例输出\n");     for(count = 0; count < N; count++)     {         printf("%d\n", AnalysisStr(MatchTbl[count].s, MatchTbl[count].p));     } }   int main() {     PatternMatch();     getchar(); }  貌似LZ想让大家给他写作业，一条题100块 你看可否~~