LeetCode28 实现 strStr()

Posted by Think different. on November 27, 2020

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

1.我的解法–偷鸡

查看题目要求,发现Java中String类的indexOf方法完美匹配。省时省力,偷得一手好鸡

class Solution {
        public int strStr(String haystack, String needle) {
        if(needle==null||"".equals(needle)){
            return 0;
        }
        int flag = 0;
        flag = haystack.indexOf(needle);
        return flag;
    }
}
执行结果通过
显示详情执行用时0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗37 MB, 在所有 Java 提交中击败了86.76%的用户

2.我的第二种解法–截取字符串比较

解题思路:

首先判断两组特殊值,当needle为空时,返回0;当haystack等于needle时,返回0

然后处理普通情况:遍历haystack,判断截取needle长度的haystack是否和needle相等,如果相等,那么当前索引值就是返回的结果。

class Solution {
        public int strStr(String haystack, String needle) {
        if(needle==null||"".equals(needle)){
            return 0;
        }
        if (haystack.equals(needle)){
            return 0;
        }
        int flag = -1;
        for(int i=0;i<haystack.length()-needle.length()+1;i++){
            if(needle.equals(haystack.substring(i,i+needle.length()))){
                flag=i;
                break;
            }
        }
        return flag;
    }
}
执行结果通过
显示详情
执行用时1 ms, 在所有 Java 提交中击败了74.81%的用户
内存消耗38.1 MB, 在所有 Java 提交中击败了42.70%的用户

3.官方解法

官方解法用到了上述我用到的截取字符串比较,还使用了双指针法和Rabin Karp - 常数复杂度