文章

16

粉丝

82

获赞

1

访问

15.6k

头像
字符串匹配的问题求解,头痛
我要提问
发布于2024年3月16日 00:01
阅读数 1.4k

这是两个字符串s1,s2跟字符串s匹配的问题,求匹配的两个字符串的最大间隔。求问第二个字符串匹配(从s的末尾开始跟s2的末尾倒着匹配便于解题)的算法错在哪里了?(为了看到匹配情况我把两个匹配的字符输出了,但是输出的结果怪怪的),第一个匹配就没问题crying

char s[300],s2[10],s1[10];
  int len=0,len1=0,len2=0;
  char ch;
  while((scanf("%c",&ch))&&ch!=',') {s[len++]=ch;}
  while((scanf("%c",&ch))&&ch!=',') {s1[len1++]=ch;}
  while(scanf("%c",&ch)!=EOF) {s2[len2++]=ch;}//题目要求三组字符串用逗号分隔
  int i,j,left,right;//left和right用来记录两个字符串匹配的起始点
  int flag;//第一组匹配
 for(i=0;i<len;i++)
  {
      flag=0;//记录匹配长度;

      for(j=0;j<len1;j++)
      { printf("%c %c\n",s[i+j],s1[j]);
          if(s[i+j]==s1[j])
          {
              flag++;
          }
          else
         ...

登录查看完整内容


登录后发布评论

10 条评论
我爱陈少熙 VIP
2024年3月19日 23:25

请问我这个最后俩乱码是因为这个数组最后没有结束符吗?

然后我在后面加了结束符就没有了,所以是说如果通过读取单个字符的形式输入字符串的话,是不是得记得在末尾加个结束符,但是如果是gets的话就不用

赞(0)

snake : 回复 我爱陈少熙: 是这个意思,因为定义在函数里的数组不会默认初始化

2024年3月20日 00:12
snake VIP
2024年3月16日 22:51

我跑了一下你的代码,没什么问题啊

代码如下:

#include <iostream>
using namespace std;

int main()
{
    char s[300],s2[10],s1[10];
  int len=0,len1=0,len2=0;
  char ch;
  while((scanf("%c",&ch))&&ch!=',') {s[len++]=ch;}
  while((scanf("%c",&ch))&&ch!=',') {s1[len1++]=ch;}
  while((scanf("%c",&ch))&&ch!='\n') {s2[len2++]=ch;}//题目要求三组字符串用逗号分隔
  int i,j,left,right;//left和right用来记录两个字符串匹配的起始点
  int flag;//第一组匹配
 for(i=0;i<len;i++)
  {
      flag=0;//记录匹配长度;

      for(j=0;j<len1;j++)
      { printf("%c %c\n",s[i+j],s1[j]);
          if(s[i+j]==s1[j])
          {
              flag++;
          }
          else
            break;
      }
      if(flag==len1)
      {
          left=i+len1-1;
          break;
      }
  }
  printf("%d\n",left);

//第二组匹配

for(i=len-1;i>=0;i--)
  {
      flag=0;//记录匹配长度;
      for(j=0;j<len2;j++)
      {
          printf("%c %c\n",s[i-j],s2[len2-1-j]);
         if(s[i-j]==s2[len2-1-j])
          {
               flag++;
          }
          else break;
      }
      if(flag==len2)
      {
          right=i-len2+1;
          break;
      }
  }
printf("%d\n",right);
    return 0;
}
/*
abcd123ab888efghij45ef67k1,ab,ef
*/

 

赞(0)

我爱陈少熙 : 回复 snake: 是不是因为while(scanf("%c",&ch)!=EOF这个语句输入字符的话会陷入死循环啊,多组输入的话用eof输入数字可以,字母就还是用判断回车结束比较好

2024年3月19日 19:10

snake : 回复 我爱陈少熙: 嗯,IDE上调试用回车比较好,提交OJ判题可以用EOF

2024年3月19日 19:23

我爱陈少熙 : 回复 snake: char ch; char a[105]; int i=0; while((scanf("%c",&ch))&&ch!='\n') {a[i++]=ch;}可是为啥我这样输入也死循环呀,输入回车也不停止

2024年3月19日 22:32

snake : 回复 我爱陈少熙: 这段代码看起来没有问题,在楼上贴一下完整代码看看

2024年3月19日 22:44

我爱陈少熙 : 回复 snake: 我贴了一个新的图uu

2024年3月19日 23:26
snake VIP
2024年3月16日 00:17

第二组既然倒着匹配了,那么这个也应该倒着

 for(j=0;j<len2;j++)

变成

 for(j=len2-1;j>=0;j--)

这样算坐标更容易理解

 

赞(0)

我爱陈少熙 : 回复 snake: for(i=len-1;i>=0;i--) { flag=0;//记录匹配长度; for(j=len2-1;j>=0;j--) { printf("%c %c\n",s[i-len2+1+j],s2[j]);} 但是直接不输出了

2024年3月16日 22:13