实现 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() 定义相符。
这个应该比较简单,KMP算法就可以解决了,当然Python也可以一行代码实现(return haystack.find(needle)),感觉这样就失去了这个题目的意义了哈。至于kmp这个经典算法,就不过多解释了,之所以总结是感觉以后这个算法还会用到。
# @Time :2018/7/3
# @Author :LiuYinxing
# 解题思路 kmp 算法
class Solution:
def strStr(self, haystack, needle):
if len(needle) == 0: return 0
n, m = len(haystack), len(needle)
next = [0] * m
self.GetNext(needle, next) # 初始化next数组
i, j = 0, 0
while i < n and j < m:
if j == -1 or haystack[i] == needle[j]:
i, j = i + 1, j + 1
else:
j = next[j]
return i - m if j >= m else -1
def GetNext(self, t, next): # 计算next数组
j, k, next[0], n = 0, -1, -1, len(next)
while j < n - 1:
if k == -1 or t[j] == t[k]:
j, k = j + 1, k + 1
next[j] = k
else:
k = next[k]
if __name__ == '__main__':
haystack, needle = 'hello', 'll'
solu = Solution()
print(solu.strStr(haystack, needle))
# @Time :2018/7/6
# @Author :LiuYinxing
# 解题思路 kmp 算法,next数组改进版
class Solution:
def strStr(self, haystack, needle):
if len(needle) == 0: return 0
n, m = len(haystack), len(needle)
next = [0] * m
self.GetNext(needle, next) # 初始化next数组
i, j = 0, 0
while i < n and j < m:
if j == -1 or haystack[i] == needle[j]:
i, j = i + 1, j + 1
else:
j = next[j]
return i - m if j >= m else -1
def GetNext(self, t, next): # 计算改进版next数组
j, k, next[0], n = 0, -1, -1, len(next)
while j < n - 1:
if k == -1 or t[j] == t[k]:
j, k = j + 1, k + 1
if t[j] != t[k]:
next[j] = k
else:
next[j] = next[k]
else:
k = next[k]
if __name__ == '__main__':
haystack, needle = 'hello', 'll'
solu = Solution()
print(solu.strStr(haystack, needle))
欢迎指正哦