代码随想录算法训练营第九天| LeetCode28. 找出字符串中第一个 、LeetCode459. 重复的子字符串

一、LeetCode28. 找出字符串中第一个

        1:题目描述(28. 找出字符串中第一个

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回  -1 。

        2:解题思路

        直接遍历字符串haystack,每次截取字符串needle长度的子串,与needle进行对比,看子串与needle是否相等,相等则返回子串的起始位置,不相等则继续遍历,直到遍历到最后一个与needle长度相等的子串。

class Solution:
    def strStr(self, haystack, needle):
        needle_len = len(needle)
        haystack_len = len(haystack)
        i =0
        # 当i小于haystack的长度,并且剩余的子串长度大于等于needle的长度时
        while i <= haystack_len and haystack_len-i >= needle_len:
            s = haystack[i:i+needle_len]
            if needle == s:
                return i
            else:
                i += 1
        return -1

二、LeetCode459. 重复的子字符串

        1:题目描述(459. 重复的子字符串

        给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。

        2:解题思路

        解法一:遍历字符串s ,获取每个以首字母开头的子串s1,然后在除去s1剩下的字符串中,去判断是否由子串s1组成。

class Solution:
    def repeatedSubstringPattern(self, s):
        # # 遍历寻找子串,判断s是否由其中一个子串组成
        for i in range(len(s)):         # 遍历字符串,寻找以首字母开头的子串s1
            s1 = s[:i+1]
            j = i+1                     # 从s1子串结束的下一个位置,开始遍历剩余的字符串
            while j < len(s):           # 
                s2 = s[j:j+len(s1)]     # 在剩余的字符串中,每次从上一个子串结束的下一个位置,取s1长度的子串s2
                j += len(s1)            # 修改下一个子串开始的位置
                if s1 != s2:            # 当有一次s1 != s2, 则说明字符串s不是由s1组成的,结束本层循环
                    break
            if j == len(s):             # 判断此时j是否等于字符串s的长度,不等于,继续遍历字符串s,寻找下一个子串s1
                if s1 == s or s1 != s2:  # j等于字符串s的位置,s1与s相等,或者最后得到的s2 != s1,返回False
                    return False 
                return True              # 否则,返回True

        解法二:将字符串s拼接成一个新的字符串s1=s+s,把字符串s1的首尾字符去掉,得到一个新的字符串s2,判断字符串s是否在字符串s2中,在,则表示s可由一个字符串重复多次组成;不存在则表示s不可由一个字符串重复多次组成。  

class Solution:
    def repeatedSubstringPattern(self, s):
        # 将字符串拼接成一个新的字符串
        s1 = s + s
        # 去除s1的首尾两个字符
        s2 = s1[1:-1]
        if s in s2:           # 字符串s在s2中,说明s是由它的一个子串重复组成
            return True
        else:                 # 字符串s不在s2中,说明s不是由它的一个子串重复组成
            return False

今日总结:

        KMP算法还不是很理解,使用其他的解法把这两道写了写,459. 重复的子字符串这道题使用暴力解法(也就是解法一)还是捣鼓了很久。对之前的还没有进行总结,后面总结吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值