实现 strStr()

实现 strStr() 函数。

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。

说明:

当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。

对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。

示例 1:

输入:haystack = “hello”, needle = “ll”
输出:2
示例 2:

输入:haystack = “aaaaa”, needle = “bba”
输出:-1
示例 3:

输入:haystack = “”, needle = “”
输出:0

第一次提交

没有考虑到needle字符串里面可能会出现和needle字符串首字母相同的情况,情况考虑不周。

int strStr(char * haystack, char * needle){
    int x=strlen(haystack),y=strlen(needle);
    int m=0,flag=0;
    if(y==0) return 0;
    for(int i=0; i<x; i++){
        if(haystack[i]==needle[0]){
            m=i;
            for(int j=0; j<y; j++){
                if(needle[j]!=haystack[i++]){
                    flag=1;
                    break;
                }
                if((flag==0)&&j==y-1)
                    return m;
            }
        }
    }
    return -1;
}

在这里插入图片描述

第二次提交

对第一次提交的代码进行改进之后,可以解决第一次提交没有考虑到的情况,但是两层循环导致超时了。

int strStr(char * haystack, char * needle){
    int x=strlen(haystack),y=strlen(needle);
    int m=0,flag=0;
    if(y==0) return 0;
    for(int i=0; i<x; i++){
        if(haystack[i]==needle[0]){
            m=i;
            flag=0;
            for(int j=0; j<y; j++){
                if(needle[j]!=haystack[i++]){
                    flag=1;
                    i=m;
                    break;
                }
                else if((flag==0)&&j==y-1)
                    return m;
            } 
        }
    }
    return -1;
}

在这里插入图片描述

第三次提交

在题解中瞟到的代码,这次代码很简约,巧妙地将两层循环变成了一层循环,而且他的i=i-j+1就很妙,不禁感叹一句”妙啊“,简直秒不可言。
看到一条也同样很妙的评论:

“这方法是一个个暴力匹配的 代码确实很巧妙 只用了一个while循环实现了i和j的所有遍历 以及成功条件的判断 但性能上应该没有这么优吧”

该评论对该代码进行了高度概括,妙啊!

int strStr(char * haystack, char * needle){
  int len_H=strlen(haystack);
  int len_N=strlen(needle);
  int i=0,j=0;
  if(len_N==0) return 0;
  while(i<len_H&&j<len_N){
      if(haystack[i]==needle[j]) {i++;j++;}
      else{
          i=i-j+1;
          j=0;
      }
  }
  if(j==len_N) return (i-j);
  return -1;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值