【算法训练】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