跳至主要內容

查找子串

yczha大约 2 分钟AlgorithmleetcodeleetcodeC++Python

Leetcode算法练习第二十八题:查找子串

问题描述

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

示例 1:

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

示例 2:

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

说明:

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

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

解法一:KMP算法

还没搞懂....

解法二:遍历回溯

同时遍历两个字符串,一旦发现不匹配位置则子串再次从0开始,而主串则回溯到上一次开始位置的下一个位置。

复杂度

最坏情况下,主串每走一步子串就要遍历一次,这样复杂度为O(m*n);空间复杂度为O(1);

Python

class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        if needle is None or haystack is None:
            return
        if len(needle)==0:
            return 0
        if len(haystack)==0 or len(needle)>len(haystack) or needle not in haystack:
            return -1
        ptrh,ptrn=0,0
        while ptrh<len(haystack):
            if haystack[ptrh]==needle[ptrn]:
                if ptrn==len(needle)-1:
                    return ptrh-ptrn
                ptrn+=1
                ptrh+=1
            else:
                ptrh=ptrh-ptrn+1
                ptrn=0
        if ptrn<len(needle)-1:
            return -1
        else:
            return ptrh-ptrn

C++

class Solution {
public:
    int strStr(string haystack, string needle) {
        if(needle.length()>haystack.length())return -1;
        if(needle.length()==0)return 0;
        if(haystack.length()==0)return -1;
        
        int ptrn=0,ptrh=0;
        while(ptrh<haystack.length()){
            if(haystack[ptrh]==needle[ptrn]){
                if(ptrn==needle.length()-1)return ptrh-ptrn;
                ptrn++;
                ptrh++;
            }
            else{
                ptrh=ptrh-ptrn+1;
                ptrn=0;
            }
        }
        if(ptrn!=needle.length())return -1;
        else return ptrh-ptrn;
    }
};

解法三:内置函数

C++

class Solution {
public:
    int strStr(string haystack, string needle) {
        return haystack.find(needle);
    }
};

Python

class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        return haystack.find(needle)