Manchester


私信TA

用户名:wenyajie

访问量:313641

签 名:

在历史前进的逻辑中前进,这个逻辑就是人心向背的逻辑

等  级
排  名 1
经  验 62855
参赛次数 1
文章发表 188
年  龄 0
在职情况 学生
学  校 Xiamen University
专  业 计算机科学

  自我简介:

在历史前进的逻辑中前进,这个逻辑就是人心向背的逻辑

解题思路:
1):设主串为

A  B  C  D  E  F  G  H  I  G  K

2):设模式串为

E  F  G

3):

①:开始,先从主串的第一个字符开始匹配

A  B  C  D  E  F  G  H  I  G  K

E  F  G    (匹配失败)

②:从主串第二个字符开始匹配

B  C  D  E  F  G  H  I  G  K

    E   F  G    (匹配失败)

③:从主串第三个字符开始匹配

A  B  C  D  E  F  G  H  I  G  K

         E   F  G    (匹配失败)

....................

④:直到从主串第五个字符开始时匹配成功

A  B  C  D  E  F  G  H  I  G  K

                   E   F  G    (匹配成功)


参考代码:

#include<stdio.h>
#include<string.h>

typedef struct string_{
  char data[99];
  int length;

}*String,STRIng;

int Match(String Str,String Substr);

int main()
{
  int k; /*存放模式串出现位置*/
  STRIng Str,Substr; /*定义主串和模式串*/

   while(scanf("%s",Str.data)!=EOF)
    {
         scanf("%s",Substr.data);
         /*求出主串,和模式串的长度*/
          Str.length=strlen(Str.data);
          Substr.length=strlen(Substr.data);

          k=Match(&Str,&Substr); /*求模式串第一次出现的位置*/
          printf("%d\n",k+1);  /*輸出位置,因爲這裏字符串第一个下标从0开始,所以k要加上一*/
    }
return 0;
}
/*----------------------------------------------*/
int Match(String Str,String Substr)
{
   int i=0,j=0,k=i;/*i,j分别指向主串和模式串的第一个字符,k表示这次比较从主串中下标为k的地方开始*/
    while(i<Str->length&&j<Substr->length)
     {
          if(Str->data[i]==Substr->data[j])
           {
             ++i;
             ++j;
           }
           else
           {
             i=++k;
             j=0;
           }
     }

     if(j==Substr->length)
       return k;
       else
       return -1; /*返回-1是因为没找到要输出0*/

}

别忘点赞哦-.-

 

0.0分

1 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区

#include<stdio.h>
#include<string.h>
int main()
{
	int j=0,i;
	char S[99];
	char s[99];
	while(scanf("%s",S)!=EOF) 
	{
		scanf("%s",s);
	    for(i=0;i<strlen(S);i++)
	    {
	    	if(S[i]==s[j])
	    	j++;
	    	else
	    	j=0; //j归零 
	    	if(j==strlen(s))  //找到子串 
	    	break;  //退出for循环 
		}  
		if(j!=0)
	       	printf("%d",i-strlen(s)+2); //字串首位置 
	        else
	        printf("%d",0);
}
	return 0;
 }  学了一个月  有没有大神教教为什么这样提交是错的  用devc++运行的时候是没问题的
2024-03-06 21:22:21
  • «
  • 1
  • »