美文网首页
leetcode-cn 实现strStr()

leetcode-cn 实现strStr()

作者: 一笑超人 | 来源:发表于2019-06-11 13:59 被阅读0次

    题目如图:


    实现strStr()

    其实这道题相当于让我们自己手写indexOf(),平时用惯了api,手写起来不是很容易,我自己就换了好几种写法,代码如下:

    private static int strStr(String haystack, String needle) {
        if (haystack == null || needle == null) {
            return -1;
        }
        int needleLength = needle.length();
        if (needleLength == 0) {
            return 0;
        }
        int stackLength = haystack.length();
        if (needleLength > stackLength) {
            return -1;
        }
        int i = 0, j = 0, count = 0;
        // i < stackLength - (needleLength - j - 1) 目的是为了减少查找次数
        // 例如 A = "aabbccdef" B = "def" 当 j = 0 的时候最多只能到A串的'd',后面的“ef”没必要查找
        // 当 j = 1 的时候 最多只能到 A 中的 'e' 相当于动态限制
        for (; j < needleLength && i < stackLength - (needleLength - j - 1); i++, j++) {
            while (haystack.charAt(i) != needle.charAt(j) && i < stackLength - (needleLength - j - 1)) {
                // 全部遍历了还没找到 只针对于 needleLength = 1 或者两个字符串长度相等
                if (i == stackLength - 1 || needleLength == stackLength) {
                    return -1;
                }
                if (count == 0) {
                    // 没有找到过,就一直找下去
                    ++i;
                } else {
                    // 找到过,但是中间某个不匹配了,要重新找 即 j 指针指向 0
                    // 例如 abccbcdd 和 bcd 之前匹配到 bc count = 2 
                    // 然后 c 和 d 不匹配,所以需要重新匹配,i 从之前的 index 即 (i - count) 再加 1 位出发就好
                    j = 0;
                    i = (i - count) + 1;
                    count = 0;
                }
            }
            if (++count == needleLength && i < stackLength - (needleLength - j - 1)) {
                return i - count + 1;
            }
        }
    
        return -1;
    }
    

    看了第一名的代码,愈发觉得jdk作者的强大🤣


    indexOf()
    实现strStr()

    相关文章

      网友评论

          本文标题:leetcode-cn 实现strStr()

          本文链接:https://www.haomeiwen.com/subject/aofqfctx.html