leetcode 28.实现strstr()(implement strstr)C语言

leetcode 28.实现strstr(implement strstr)C语言

    • 1.description
    • 2.solution

1.description

https://leetcode-cn.com/problems/implement-strstr/

实现 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() 定义相符。

2.solution

int strStr(char * haystack, char * needle){
    int res = -1;
    int m = strlen(haystack);
    int n = strlen(needle);
    if(n==0) return 0; // 题目中有提到,当 needle 是空字符串时我们应当返回 0,与C语言的 strstr() 中定义相符
    if(n>m) return -1; // haystack长度大于needle,一定不存在needle子串
    int i = 0;
    int j = 0;
    int matched_len = 0;
    // 双指针
    while(i<m && j<n){
        if(haystack[i]!=needle[j]){
            // 判断在这之前是否找到了匹配上第一个字母的res,res == -1也可以换成j==0
            if(res == -1){ // 如果没找到,i++继续找
                i++;
            }else{ // 如果找到了,但是中途匹配失败,i指针移到res的下一个位置
                i = res+1;
            }
            j = 0; // 一旦中途匹配失败,j指针回到起点
            res = -1; // res恢复-1
            matched_len = 0;
        }else{ // 说明i和j指向的字符相互匹配
            matched_len++;
            // matched_len避免多次更新res,第一次匹配上才更新res
            if(matched_len==1){
                res = i;
            }
            i++; // i和j同时右移
            j++;
        }
    }

    // 成功找到子串一定是j==n的,如果不进行判断会出错
    // 例如haystack=="mississippi" needle=="issipi",issipi的第一个i匹配了mississippi最后的i,会返回10
    if(j==n) return res;
    return -1;
}

你可能感兴趣的:(leetcode,字符串)