每日算法:实现 strStr()

111 阅读1分钟

这是我参与8月更文挑战的第二十一天,活动详情查看:8月更文挑战

28. 实现 strStr()

题目描述

实现 strStr() 函数。

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回  -1 ****。

说明:

当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。

对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。

示例

示例 1:

输入: haystack = "hello", needle = "ll"
输出: 2

示例 2:

输入: haystack = "aaaaa", needle = "bba"
输出: -1

示例 3:

输入: haystack = "", needle = ""
输出: 0

提示

  • 0 <= haystack.length, needle.length <= 5 * 104
  • haystack 和 needle 仅由小写英文字符组成

思路分析

  1. 思路一: 这道题说白了就是个 匹配 问题,我们知道String中有一个 indexOf 的方法,可以直接返回某个指定的字符串值在字符串中首次出现的位置。这样我们第一种方法就有了。(代码见下)

  2. 思路二:

使用切割法 如果第一个字母相等 就切割出与 needle 长度相等的字符串 与needle相比较 相等则返回当前i值;若不相等,则继续循环。

注意的是【int i = 0; i <= haystack.length()-needle.length(); i++】循环条件

代码实现

  • 方法一:

简单粗暴,直接运用string的方法indexOf

return haystack.indexOf(needle);
  • 方法二:
char[] arr1 = haystack.toCharArray();
        char[] arr2 = needle.toCharArray();
        for(int i = 0; i <= arr1.length - arr2.length; i++){
            int j;
            for(j = 0; j < arr2.length; j++){
                if(arr1[i + j] != arr2[j]){
                    break;
                } 
            }
            if(j == arr2.length){
                return i;
            }
        }
        return -1;

最后

链接:切割解法 - 实现 strStr()

欢迎大佬提供新思路~