• 实现 strStr()函数


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 weixin_54910555 2024-03-28 15:05 采纳率: 22.2% 浏览 1 首页/ 编程语言 / 实现 strStr()函数 c语言算法学习方法 int strStr(char* haystack, char* needle) { int i=0,j=0; char *ure=(char *)haystack; char *s1 = NULL; char *s2 = NULL; while(*ure != '\0') { s1 = ure; s2=(char *)needle; while((* s1 != '\0')&&(* s2 != '\0')&&(* s1 == * s2)) { j=i; s1++; s2++; } if(* s2 == '\0') { return j; } i++; ure++; } return -1; } int strStr(char* haystack, char* needle) { int i=0,j=0; char *ure=(char *)haystack; while(*ure != '\0') { while((* haystack != '\0')&&(* needle != '\0')&&(* haystack == * needle)) { j=i; haystack++; needle++; } if(* needle == '\0') { return j; } i++; ure++; } return -1; } 为什么在输入haystack="hello",needle="ll";第一份代码可以正确执行,第2份就不行,第一份代码我只是将 s1 = ure;s2=(char *)needle;多赋值而已这是为什么 展开全部 收起 写回答 好问题 1 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    2条回答 默认 最新

    • 一盏黄黄旧旧的灯 2024-03-28 15:19
      关注

      在这两个版本的 strStr 函数中,它们都是试图在字符串 haystack 中查找子串 needle。第一份代码中,在外部循环里对 s1 和 s2 分别赋值为 ure 和 needle,然后在内部循环中逐字符比较 s1 和 s2 是否相等,直到找到匹配项或者 needle 结束。这样每次外部循环开始时都会重置 s1 和 s2 指针,确保从当前 ure 位置重新开始搜索子串。

      第二份代码中,虽然也是逐字符比较 haystack 和 needle,但是在内部循环结束后并没有重置 s2 指针。这就意味着,一旦在某次外部循环中未能找到完整的子串 needle,接下来的外部循环将继续从上次未完成的位置继续比较,而不是回到当前 ure 位置重新开始。

      对于输入 haystack="hello" 和 needle="ll" 来说,第一份代码能够正确地在每个 ure 位置开始重新检查子串,所以在 "hel" 后面找到了 "ll" 子串。

      而第二份代码在第一次未能找到 "ll"(在 "he" 之后直接跳过了 "l")后,第二次外部循环时,haystack 指针移动到了第二个 "l",但此时 needle 指针已经指向了 "l" 之后的空字符 \0,所以即使后面还有匹配的 "ll",也无法找到,从而导致无法正确执行。

      为了使第二份代码也能正确找到子串,需要在内层循环之前重置 haystack 指针为 ure。以下是修改后的第二份代码:

      int strStr(char* haystack, char* needle) {
          int i = 0, j = 0;
          char *ure = (char *)haystack;
      
          while (*ure != '\0') {
              char *haystackBackup = ure; // 添加这一行,用于备份当前待查找位置的指针
      
              while ((*haystack != '\0') && (*needle != '\0') && (*haystack == *needle)) {
                  j = i;
                  haystack++;
                  needle++;
              }
      
              // 在内层循环结束后,恢复haystack到备份的ure位置
              haystack = haystackBackup;
      
              if (*needle == '\0') {
                  return j;
              }
      
              i++;
              ure++;
          }
      
          return -1;
      }
      
      

      展开全部

      评论
    • Kwan的解忧杂货铺 Java领域优质创作者 2024-03-28 15:06
      关注

      weixin_54910555 下午好🌅🌅🌅
      本答案参考ChatGPT-3.5

      两份代码的主要区别在于对指针的处理和赋值。

      第一份代码中,将haystack和needle转换成char指针s1和s2,然后进行比较。每次循环中,s1和s2都会向后移动一个位置,而i和j则是记录相应的当前位置。当s2指针到达字符串结尾时,说明找到了匹配的子串,返回j即可。

      第二份代码中,直接对haystack和needle进行比较。每次循环中,haystack和needle都会向后移动一个位置,i和j同样记录当前位置。当needle指针到达字符串结尾时,说明找到了匹配的子串,返回j即可。

      差异解析: 第一份代码中,s1和s2指针始终指向了原始的haystack和needle地址,每次循环中s1和s2都向后移动,并且i和j也分别记录了当前位置。所以,当找到匹配的子串时,直接返回j即可。

      而第二份代码中,haystack和needle指针在循环中移动,i和j也分别记录当前位置。所以,当找到匹配的子串时,需要返回j作为结果。但haystack和needle指针已经发生了移动,因此,相对于原始的haystack地址,j并不是正确的索引位置。

      所以,第一份代码可以正确执行,而第二份代码不能正确执行。

      解决方案: 要使第二份代码正确执行,需要在返回结果时,相对于原始的haystack地址,计算出正确的索引位置,而不是直接返回j。可以使用j-i作为最终结果返回。

      修改后的代码如下:

      int strStr(char* haystack, char* needle) {
          int i=0,j=0;
          char *ure=(char *)haystack;
          while(*ure != '\0')
          {
              while((*haystack != '\0')&&(*needle != '\0')&&(*haystack == *needle))
              {
                  haystack++;
                  needle++;
              }
              if(*needle == '\0')
              {
                  return j - i;
              }
              i++;
              j++;
              ure++;
          }
          return -1;
      }
      

      现在,无论haystack和needle输入什么字符串,代码都能正确执行并返回预期的结果。

      展开全部

      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    git使用
    oracle中汉字占几个字节
    Spring复习:(63)doCreateBean中BeanPostProcessor的调用顺序
    艾美捷FcyRl (CD64),FCGR1A,生物活性方案
    【光电工程实训】光通信与光纤通信 电子元器件认知 万用表测量参数 元件特性 激光传声实验 自由空间光通讯 光纤光通信 全反射
    基于机器人自主移动实现SLAM建图
    基于ASRPRO智能离线语音识别模块实现人机交流对话应用
    【深度学习】【Python】【CCPD2019】 YOLOv5训练CCPD2019数据集 数据转化
    程序猿成长之路之socket篇-socket通信原理简介
    机器学习---拉格朗日乘子法、Huber Loss、极大似然函数取对数的原因
  • 原文地址:https://ask.csdn.net/questions/8080350