初级算法_字符串 --- 实现 strStr()

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、思路总结

  1. 本题是字符串中寻找字符串,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
  1. 随着算法不断的练习,明显感觉到自己写推导式、对字典、列表、字符串的内置方法使用,思路切换更加顺滑了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿_焦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值