题目在这:https://leetcode-cn.com/problems/implement-strstr/
法一:
思路分析:
Python find() 方法:
检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,如果包含子字符串返回开始的索引值,否则返回-1。
如果仅仅是为了完成本题交作业,完全可以直接用这个方法。
代码只需要一行:
return haystack.find(needle)
实际上我们刷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
法三:
使用KMP算法进行字符串匹配,我学的也是一知半解,所以先不更这块,我先去学一下,学会了再回来。。。。。