面试经典150题——找出字符串中第一个匹配项的下标

面试经典150题 day23

      • 题目来源
      • 我的题解
        • [方法一 库函数](#方法一 库函数)
        • [方法二 自定义indexOf函数](#方法二 自定义indexOf函数)
        • [方法三 KMP算法](#方法三 KMP算法)

题目来源

力扣每日一题;题序:28

我的题解

方法一 库函数

直接使用indexOf函数。
时间复杂度 :O(n)
空间复杂度:O(1)

java 复制代码
public int strStr(String haystack, String needle) {
    return haystack.indexOf(needle);
}
方法二 自定义indexOf函数

每次找到needle开始字符匹配的位置,然后从该位置开始判断是否能够生成needle字符串。
时间复杂度:O(nm)。外层循环遍历了 haystack 字符串的每个字符,内层循环则在 needle 字符串的长度范围内进行比较。因此,时间复杂度为 O(n m),其中 n 是 haystack 字符串的长度,m 是 needle 字符串的长度。

空间复杂度:O(1)

java 复制代码
public int strStr(String haystack, String needle) {
    int n=haystack.length();
    for(int i=0;i<=n-needle.length();i++){
        if(haystack.charAt(i)==needle.charAt(0)&&indexOf(haystack,needle,i)){
            return i;
        }
    }
    return -1;
}
public boolean indexOf(String haystack,String needle,int start){
    int n=needle.length();
    int i=0;
    while(i+start<haystack.length()&&i<n&&haystack.charAt(i+start)==needle.charAt(i))
        i++;
    return i==n?true:false;
}
方法三 KMP算法

KMP算法详情参见:宫水三叶
时间复杂度:O(n+m)。其中 n 是字符串 haystack 的长度,m 是字符串 needle 的长度。至多需要遍历两字符串一次。

空间复杂度:O(m)

java 复制代码
public int strStr(String haystack, String needle) {
    return KMP(haystack,needle);
}
public int KMP(String haystack,String needle){
    int m=haystack.length();
    int n=needle.length();
    if(needle==null||n==0)
        return 0;
    int next[]=new int[n];
    char need[]=needle.toCharArray();
    int i=1,j=0;
    // 构造next数组
    while(i<n){
    	//
        if(need[i]==need[j]){
            j+=1;
            next[i]=j;
            i++;
        }else{
            if(j==0){
                next[i]=0;
                i++;
            }else{
                j=next[j-1];
            }
        }
    }

    i=0;
    j=0;
    char hay[]=haystack.toCharArray();
    while(i<m){
        if(hay[i]==need[j]){
            i++;
            j++;
        }else{
            if(j==0){
                i++;
            }else{
                j=next[j-1];
            }
        }
        if(j==n)
            return i-j;
    }
    return -1;
}

有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~

相关推荐
无敌昊哥战神2 分钟前
【回溯算法巅峰之作】LeetCode 51. N皇后问题详解与常见避坑指南 (C/C++/Python)
c语言·算法·leetcode
小书房3 分钟前
Kotlin的内联函数
java·开发语言·kotlin·inline·内联函数
mftang5 分钟前
BSS段、Data段、Text段的具体含义和数据特性
数据库·算法
计算机学姐7 分钟前
基于微信小程序的校园失物招领管理系统【uniapp+springboot+vue】
java·vue.js·spring boot·mysql·信息可视化·微信小程序·uni-app
王老师青少年编程9 分钟前
csp信奥赛C++高频考点专项训练之贪心算法 --【反悔贪心】:建筑抢修
c++·算法·贪心·反悔贪心·csp·信奥赛·建筑抢修
TianFuRuanJian24 分钟前
科普 | 仿真中的“体力活”:网格验证能不能自动化?
算法·仿真·ai网格
yuzhiboyouye39 分钟前
为什么sping-boot+ mabatis。写接口时要建好几个VO。各自用途时
java
leoufung44 分钟前
LeetCode 135. Candy:从直觉到最优解的完整推导
算法·leetcode·职场和发展
WHS-_-20221 小时前
Tensor-Based Target Sensing for Resource-Irregular ISAC Systems
linux·人工智能·算法
SamDeepThinking1 小时前
第2篇:应付百万并发商品系统之需求文档
java·后端·架构