LeetCode | 实现strStr()

时间:2022-07-23
本文章向大家介绍LeetCode | 实现strStr(),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

LeetCode 题库的第 28 题——实现strStr()

  题目如下:

解题代码

  该题就是两层循环,第一层循环主要是遍历字符串,第二层循环用来进行匹配。实现代码如下:

int strStr(char* haystack, char* needle) {
    int pos = -1;
    int str1len = strlen(haystack);
    int str2len = strlen(needle);
    
    int i, n, j;
    if ( str2len == 0 ) {
        return 0;
    }
    
    for ( i = 0; i < str1len; i ++ ) {
        n = i;
        for ( j = 0; j < str2len; j ++ ) {
            if ( haystack[n++] == needle[j] ) {
                if ( j == str2len - 1 ) {
                    pos = i;
                    goto EXIT;
                }
            } else {
                break;
            }
        }
    }
EXIT:
    return pos;
}

  以上是我的解题代码,就是使用两层来进行实现,没有太好的思路,所以解题思路就没什么可说的了。上面的代码,其实还可以减少循环的次数,但是会增加一些代码量,LeetCode 对以上代码执行的时间显示为 1800 多毫秒。那么就增加一个判断,让循环次数少一些,增加的代码如下:

    for ( i = 0; i < str1len; i ++ ) {
        if ( str1len - i < str2len ) {
            return pos;
        }
        n = i;
        for ( j = 0; j < str2len; j ++ ) {
            if ( haystack[n++] == needle[j] ) {
                if ( j == str2len - 1 ) {
                    pos = i;
                    goto EXIT;
                }
            } else {
                break;
            }
        }
    }

看上面的代码,只是在第一层的 for 循环中增加了一个判断,但是 LeetCode 给出的执行时间是 0 毫秒,是不是很惊人?为什么会这样呢?原因其实很简单,当 needle 很短的时候这个判断是没有太大差别的,但是当 needle 特别长的时候,减少的循环次数就非常明显了。

由于本人水平有限,难免有误,中肯取代无理,客观代替谩骂,希望可以互相学习,共同提高!