1、题目
实现 strStr() 函数。
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。
说明
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。
示例 1:
输入:haystack = “hello”, needle = “ll”
输出:2
2、代码
from re import findall
from typing import re
import pytest
class Solution:
def strStr(self, haystack: str, needle: str) -> int:
# # 内置函数
# return haystack.find(needle)
# 单次循环
# 在haystack中截取len(needle)长度的内容,放到字典中,key是下标,value是取的值
"""
思路:
needle字符串长度为n,当haystack中的元素等于needle的开头元素,则截取haystack字符串[x:x+n]
上面截取了n多个,如果needle在上面截图的内容中,则返回下标。
将下标和截取的内容放到字典中,key是下标,value是截取的内容,只要value等于needle就返回下标key,否则-1
"""
b = {x: haystack[x:x+len(needle)] for x in range(len(haystack)) if haystack[x] == needle[0]}
for key, value in b.items():
if needle == value:
return key
return -1
class TestSolution:
def test_one(self):
b = Solution()
b.strStr("hello", "ll")
3、思路总结
- 本题是字符串中寻找字符串,python内置函数关于字符串寻找有:find()、rfind()、index()、rindex()
str1.find(str2)
返回子字符串 sub 在 s[start:end] 切片内被找到的最小索引。 可选参数 start 与 end 会被解读为切片表示法。 如果 sub 未被找到则返回 -1
str1.rfind(str2)
返回字符str2在str1最后出现的位置,未找到返回-1
str1.index(str2)
跟find一样,但是找不到会返回 ValueError
str1.rindex(str2)
跟rfind一样,但是找不到会返回 ValueError
(1)刚开始想使用双指针,然后想到第一个指针是遍历第一个字符串,如果迭代器的元素跟第二个字符的第一个元素相等,那我截取跟第二个字符串长度相同的内容,将内容、下标放到字典中。
(2)遍历字典,如果value跟第二个字符串相等,则返回key(key就是下标)。循环遍历完,还没有符合条件的,就-1
b = {x: haystack[x:x+len(needle)] for x in range(len(haystack)) if haystack[x] == needle[0]}
for key, value in b.items():
if needle == value:
return key
return -1
- 随着算法不断的练习,明显感觉到自己写推导式、对字典、列表、字符串的内置方法使用,思路切换更加顺滑了