【算法训练】LeetCode#28 找出字符串中第一个匹配项的下标

一、描述

找出字符串中第一个匹配项的下标

实现 strStr() 函数。

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

示例 1:

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

示例 2:

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

说明:

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

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

二、问题

整体思路很简单,就是通过两个位置标识符对两个数组中的元素一个一个的进行比较,不过while判断好像出了点差错

len1 = len(haystack)
len2 = len(needle)
if len2 == 0:
    return 0
if len1 < len2:
    return -1
loc1 = 0  # haystack位置标记
loc2 = 0  # needle位置标记
while loc1 < len1:
    if loc2 == len2:
        return loc1-len2
    if haystack[loc1] == needle[loc2]:
        loc1 += 1
        loc2 += 1
        continue
    loc1 += 1
    loc2 = 0
return -1

while循环的问题好改,是因为没有考虑相匹配字符串在母串最后的这种可能性。

while loc1 < len1:
    if loc2 == len2:
        return loc1-len2
    if haystack[loc1] == needle[loc2]:
        loc1 += 1
        loc2 += 1
        continue
    loc1 += 1
    loc2 = 0
if loc2 == len2:
    return loc1 - len2

又出现问题了....,真的是好久不写了,手都生疏了。

每次比较都是从上一次循环完事儿的位置,应该是从这次比较的头位置的下一位开始

三、解题

按照以往的话,我会用一个新的变量记录下每次开始比较的位置,这次算是一次进步吧

class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        len1 = len(haystack)
        len2 = len(needle)
        if len2 == 0:
            return 0
        if len1 < len2:
            return -1
        loc1 = 0  # haystack位置标记
        loc2 = 0  # needle位置标记
        while loc1 < len1:
            if loc2 == len2:
                return loc1-len2
            if haystack[loc1] == needle[loc2]:
                loc1 += 1
                loc2 += 1
                continue
            elif loc2 != 0:
                loc1 = loc1 - loc2 + 1
                loc2 = 0
                continue
            loc1 += 1
        if loc2 == len2:
            return loc1 - len2
        return -1
posted @ 2022-01-18 17:45  小拳头呀  阅读(7)  评论(0编辑  收藏  举报