张伦聪的技术博客 Research And Development

28. 实现strStr()

2018-08-28

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

解:题目不难,设置两个指针i,j分别指向haystack和needle,当碰到相同字符,保存一个fakeI,i,j同时遍历,跳出循环时如果j== nLength那说明存在,直接返回保存的fakeI,否则i重置fakeI+1继续。就是LeetCode的有些用例太恶心,比如null和空字符串,返回0和-1的问题,我觉得既然是重点考察算法,就没必要搞这些恶心的用例,只要主要算法思想出来了就行,这些临界点的问题只是让做题者多花了时间在调试代码上,没有什么意义。

class Solution {
    public int strStr(String haystack, String needle) {
        if (needle == null) {
            return 0;
        }
        int hLength = haystack.length();
        int nLength = needle.length();
        if (hLength == 0 && nLength == 0) {
            return 0;
        }
        if (hLength != 0 && nLength == 0) {
            return 0;
        }
        if (needle.equals(haystack)) {
            return 0;
        }
        int i = 0;
        int j = 0;
        while (i <= (hLength - nLength)) {
            int fakeI = i;
            while (j < nLength && haystack.charAt(i) == needle.charAt(j)) {
                i++;
                j++;
            }
            if (j == nLength) {
                return fakeI;
            } else {
                i = fakeI + 1;
                j = 0;
            }
        }
        return -1;
    }
}

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

¥ 打赏博主

类似文章

留言