【刷题记录】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;
    }
}

总结


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


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


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


继续加油~~

目录
相关文章
|
项目管理
干货|80天自学通过高级项目管理师
干货|80天自学通过高级项目管理师
448 0
|
数据库连接 Nacos 数据库
nacos在windows系统下单机模式启动四部曲(2.1.2重置密码)
nacos在windows系统下单机模式启动四部曲(2.1.2重置密码)
926 0
|
11月前
|
存储
力扣(LeetCode)数据结构练习题
力扣(LeetCode)数据结构练习题
139 0
|
Cloud Native Devops 持续交付
什么是云原生,原生开发和混合开发又是什么
什么是云原生,原生开发和混合开发又是什么
1089 3
|
算法 Java
矩阵中的路径(剑指offer 12)
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
190 0
矩阵中的路径(剑指offer 12)
|
Oracle Java 关系型数据库
Spring+Mybatis整合核心知识
Spring+Mybatis整合核心知识点
212 0
Spring+Mybatis整合核心知识
|
缓存 负载均衡 前端开发
Nginx配置文件nginx.conf配置详解
今天使用Nginx做了静态资源服务器,发现nginx的配置文件好多学问,也没有积极的去做总结,心想赶紧来到阿里云社区上,将自己总结的东西发布出来,和大家一起学习进步,希望能够帮到大家,有不对的地方希望多多指点,留言我修改一下。
343 0
Nginx配置文件nginx.conf配置详解
|
Java C语言
每日一练(37):实现 strStr()
实现 strStr() 函数。
294 0
|
算法 搜索推荐 流计算
为了帮助卖家成交,闲鱼工程师做了些什么?
亲,你有一个宝贝被拍下,请尽早发货~
3837 0
为了帮助卖家成交,闲鱼工程师做了些什么?