力扣(leetcode) 28. 实现 strStr() (一行代码解决问题)

题目在这:https://leetcode-cn.com/problems/implement-strstr/

法一:

思路分析:
Python find() 方法:
检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,如果包含子字符串返回开始的索引值,否则返回-1。

如果仅仅是为了完成本题交作业,完全可以直接用这个方法。

代码只需要一行:

return haystack.find(needle)

力扣(leetcode) 28. 实现 strStr() (一行代码解决问题)
实际上我们刷leetcode是为了面试或者提高自己的算法能力。那么直接用方法是不可取的,本题目的锻炼字符串匹配算法思维。

法二:

思路分析: 我们可以直接使用两层循环进行暴力匹配完成本题。
题中给定的两个字符串:haystack = “hello”,和 needle = “ll”
拿needle去haystack里匹配。
这里我们称haystack为主串。needle称为模式串。

首先,当模式串长度大于主串的时候,肯定是匹配失败的,也就是说没办法从主串中找到子串等于所给的模式串。
当模式串为空时,返回 0

if len(needle) > len(haystack) :
    return -1
elif len(needle) == 0:
    return 0

我们使用两层循环进行匹配,外层循环主串,内层循环模式串。
1. 当模式串没有匹配完,但主串已经匹配完的时候,匹配失败。
2. 当模式串当前位置不等于主串当前位的时候,匹配失败。
3. 当模式串匹配完了,此时匹配成功。

我们将上面三句话翻译成代码:

第一句话:

if j != len(needle)-1 and i ==len(haystack)-1:
                return -1

第二句话:

if haystack[i] != needle[j]:
                break

第三句话:

if j == len(needle)-1:
       return temp

最后,如果主串都遍历完了也没有找到模式串,则返回-1:

if i == len(haystack)-1:
        return -1

完整代码:

haystack = "hello"
needle = "ll"
if len(needle) > len(haystack) :
    return -1
elif len(needle) == 0:
    return 0
temp = 0
for i in range(len(haystack)):
    j = 0
    if haystack[i] == needle[j]:
        temp = i
        while True:
            if j != len(needle)-1 and i ==len(haystack)-1:
                return -1
            elif j == len(needle)-1:
                return temp
            i +=1
            j +=1
            if haystack[i] != needle[j]:
                break
    if i == len(haystack)-1:
        return -1

力扣(leetcode) 28. 实现 strStr() (一行代码解决问题)

法三:

使用KMP算法进行字符串匹配,我学的也是一知半解,所以先不更这块,我先去学一下,学会了再回来。。。。。

上一篇:Word添加参考文献(删除调整后文献序号自动更新)


下一篇:leedcode-28-implement strstr()