LeetCode--初级算法--字符串篇--第七题--实现strStr()


GitHub地址


题目

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

代码

这个算法String已经实现了

public static int strStr(String haystack, String needle) {
    return haystack.indexOf(needle);
}

所以来看一下String的indexOf()方法的源码吧。

/**
 * Code shared by String and StringBuffer to do searches. The
 * source is the character array being searched, and the target
 * is the string being searched for.
 *
 * @param   source       源字符串对应的char[]
 * @param   sourceOffset 源字符串的偏移量
 * @param   sourceCount  源字符串的长度
 * @param   target       目标字符串对应的char[]
 * @param   targetOffset 目标字符串的偏移量
 * @param   targetCount  目标字符串的长度
 * @param   fromIndex    从源字符串的哪个索引位置开始搜索
 */
static int indexOf(char[] source, int sourceOffset, int sourceCount,
        char[] target, int targetOffset, int targetCount,
        int fromIndex) {
    // 判断开始索引是否大于source的长度
    if (fromIndex >= sourceCount) {
        // 如果大于,判断target是否为"",是:返回sourceCount;否:-1
        return (targetCount == 0 ? sourceCount : -1);
    }
    // 调整开始索引小于0的fromIndex为0.
    if (fromIndex < 0) {
        fromIndex = 0;
    }
    // 如果target为"",返回开始的搜索的位置的索引
    if (targetCount == 0) {
        return fromIndex;
    }

    // target偏移后的第一个字符
    char first = target[targetOffset];
    // 遍历的最大索引位置
    int max = sourceOffset + (sourceCount - targetCount);
    // 从source偏移后的位置开始遍历搜索
    for (int i = sourceOffset + fromIndex; i <= max; i++) {
        // 搜索source上等于target第一个字符的索引位置
        if (source[i] != first) {
            while (++i <= max && source[i] != first);
        }

        // 判断第一个字符后的其余字符
        if (i <= max) {
            // 为了不影响到i(source第一个字符的位置),创建一个新的变量j记录第一个字符后的一个索引位置。
            int j = i + 1;
            // source遍历结束位置
            int end = j + targetCount - 1;
            // 用j和k双指针遍历source和target,判断其余字符是否相等。
            for (int k = targetOffset + 1; j < end && source[j]
                    == target[k]; j++, k++);

            // j==end证明target在source上被找到了
            if (j == end) {
                // 找到了整个字符串,返回第一个字符对应的索引
                return i - sourceOffset;
            }
        }
    }
    // 找不到返回-1
    return -1;
}
发布了126 篇原创文章 · 获赞 75 · 访问量 13万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览