[力扣c语言实现]28.实现strStr()

28.实现strStr

  • 1. 题目描述
  • 2.代码如下

1. 题目描述

实现 strStr() 函数。

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

示例 1:

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

输入: haystack = “aaaaa”, needle = “bba”
输出: -1
说明:

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/implement-strstr
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2.代码如下

//2019-1-12
//当主串与子串都很长且只有最后一个字符不等时,时间复杂度会很高,不是一个健壮的算法。
int strStr(char* haystack, char* needle) {
    char *parentstring = haystack;
    char *parenttemp = NULL;
    char *subtemp = NULL;
    int count;
    int pos = 0;
    if(strlen(haystack)<strlen(needle))
    {
        return -1;
    }
    
    if(needle[0]=='\0')
    {
        return 0;
    }
    else if(needle[0]!='\0'&&haystack[0]=='\0')
    {
        return -1;
    }
    while(*parentstring!='\0')
    {
        parenttemp = parentstring;
        subtemp = needle;
        count = 0;
        while((*parenttemp == *subtemp)&&(*parenttemp!='\0'&&*subtemp!='\0'))
        {
            parenttemp++;
            subtemp++;
            count++;
            if(count==strlen(needle))
            {
                return pos;
            }
        }
        pos++;
        parentstring++;
    }
    if(pos = strlen(haystack)-1)
        return -1;
    return 0;
}

//参考别人后的解法
int strStr(char* haystack, char* needle)
{
    int i,j;
    int flag = 1;
    int p;
    int mid;
    int sublen;
    if(needle == "")
    {
         return 0;
    }
    if(strlen(haystack) < strlen(needle))
    {
       return -1;
    }
    mid = strlen(haystack) - strlen(needle)+1;
    sublen = strlen(needle);
    for(i = 0;i<mid;i++)
    {
        p = i;
        for(j = 0;j<sublen;j++)
        {
            if(haystack[p++] != needle[j])
            {
                flag = 0;
                break;
            }
            flag = 1;
        }
        if(flag == 1)
        {
            return i;
        }
    }
    return -1;
}
/*
问题1:为什么是strlen(haystack) - strlen(needle)+1?
经调试过程得知:主串与子串的长度差为strlen(haystack) - strlen(needle),
在迭代匹配的过程中,在主串与子串的当前比较的字符不相等的情况下,主串的比较位置就要右移一个单位,
在移动了strlen(haystack) - strlen(needle)个单位后,主串的“剩余”长度与子串的长度相等,
此时,若两者还不匹配,则主串继续偏移,导致其长度彻底小于子串长度,以后就不用匹配了,
主串小于子串的情况下按照题目要求,直接返回-1.
*/

你可能感兴趣的:(力扣算法题练手)