【刷题记录】28. 实现 strStr()

简介: 【刷题记录】28. 实现 strStr()

一、题目描述


来源:力扣(LeetCode)


实现 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


二丶思路分析


暴力匹配


我们直接以haystack的每一个字符为起点,长度为needle 的子串与 needle 对比


  • 匹配,返回起点所在位置
  • 不匹配,继续下一个子串
  • 所有都不满足 返回 -1


三、代码实现

class Solution {
    public int strStr(String haystack, String needle) {
        int len1 = haystack.length();
        int len2 = needle.length();
for (int i =0; i + len2 <= len1; i++) {
            boolean flag =true;
for (int j =0; j < len2; j++) {
if (haystack.charAt(i + j) != needle.charAt(j)) {
                    flag =false;
                    break;
                }
            }
if (flag) {
                return i;
            }
        }
        return -1;
    }
}

复杂度分析


  • 时间复杂度:
    网络异常,图片无法展示
    |
    ,其中 n 是字符串 haystack 的长度,m 是字符串 needle 的长度
  • 空间复杂度:
    网络异常,图片无法展示
    |


运行结果


网络异常,图片无法展示
|


官方的另外解法


看官方题解,除了暴力,还可以使用 KMP 算法来解决。
详细的题解太长,就不列出来,有兴趣的可以自行 点击查看


这里只贴出来代码实现

class Solution {
    public int strStr(String haystack, String needle) {
        int n = haystack.length(), m = needle.length();
if (m ==0) {
            return 0;
        }
        int[] pi = new int[m];
for (int i =1, j =0; i < m; i++) {
while (j > 0 && needle.charAt(i) != needle.charAt(j)) {
                j = pi[j -1];
            }
if (needle.charAt(i) == needle.charAt(j)) {
                j++;
            }
            pi[i] = j;
        }
for (int i =0, j =0; i < n; i++) {
while (j > 0 && haystack.charAt(i) != needle.charAt(j)) {
                j = pi[j -1];
            }
if (haystack.charAt(i) == needle.charAt(j)) {
                j++;
            }
if (j == m) {
                return i - m +1;
            }
        }
        return -1;
    }
}

总结


常规思路都是我们能够想出来,并且是普遍能总先想到的。


想要更进一步的优化,我们就要熟悉这类问题可以用那些相应的数学算法来优化我们的处理过程


多看,多接触,多了解,多练习。


继续加油~~

目录
相关文章
|
10月前
|
算法
LeetCode-28 实现strStr() KMP算法的学习
LeetCode-28 实现strStr() KMP算法的学习
|
算法 安全 Java
LeetCode - #28 实现 strStr()
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
|
算法
【数据结构与算法】字符串2:KMP & 实现 strStr() & 重复的子字符串
【数据结构与算法】字符串2:KMP & 实现 strStr() & 重复的子字符串
50 0
|
算法 Java C语言
leetcode:28.实现strStr()
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
50 0
|
存储 算法 索引
代码随想录刷题|LeetCode KMP算法理论 28. 实现 strStr() 459.重复的子字符串
代码随想录刷题|LeetCode KMP算法理论 28. 实现 strStr() 459.重复的子字符串
代码随想录刷题|LeetCode KMP算法理论 28. 实现 strStr() 459.重复的子字符串
|
Java Go C语言
【刷题】自己实现strStr()
【刷题】自己实现strStr()
102 0
【刷题】自己实现strStr()
|
Java C语言 索引
力扣第13刷-实现 strStr()
力扣第13刷-实现 strStr()
力扣第13刷-实现 strStr()
|
机器学习/深度学习 算法
怒刷力扣(实现strStr)
今日讲的是KMP模式匹配算法,不会的兄弟,务必进来学习学习。这个算法也是常用的算法之一,必须掌握的技巧之一。
135 0
怒刷力扣(实现strStr)
【刷题记录】14.最长公共前缀
【刷题记录】14.最长公共前缀
123 0
【刷题记录】14.最长公共前缀
|
算法
【刷题记录】5. 最长回文子串
【刷题记录】5. 最长回文子串
126 0
【刷题记录】5. 最长回文子串