实现 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;
}