Leetcode 467. 环绕字符串中唯一的子字符串
本文最后更新于199 天前,其中的信息可能已经过时,如有错误请发送邮件到2446865563@qq.com

1.题目基本信息

1.1.题目描述

定义字符串 base 为一个 "abcdefghijklmnopqrstuvwxyz" 无限环绕的字符串,所以 base 看起来是这样的:

  • "...zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd....".

给你一个字符串 s ,请你统计并返回 s 中有多少 不同非空子串 也在 base 中出现。

1.2.题目地址

https://leetcode.cn/problems/unique-substrings-in-wraparound-string/description/

2.解题方法

2.1.解题思路

动态规划。在字符串base中,只要知道子串的结尾字符和长度,就能确定一个子串;为了找到s中有多少个不同的非空子串在base中出现,只需找以各个不同字符结尾的最长匹配子串的长度即可,然后各个最长长度的和即为题解

2.2.解题步骤

第一步,状态定义。dp[\alpha]为s中以字符\alpha结尾的最长匹配子串的长度

第二步,状态初始化。dp[s[0]]=1

第三步,状态转移。dp[\alpha]=max(dp[\alpha],dp[\alpha-1]+1)。使用length维护以当前的s[i]结尾的最长子串的长度

第四步,sum(dp)即为题解

3.解题代码

python3代码

class Solution:
    def findSubstringInWraproundString(self, s: str) -> int:
        # 思路:动态规划。在字符串base中,只要知道子串的结尾字符和长度,就能确定一个子串;为了找到s中有多少个不同的非空子串在base中出现,只需找以各个不同字符结尾的最长匹配子串的长度即可,然后各个最长长度的和即为题解
        n = len(s)
        # 第一步,状态定义。dp[\alpha]为s中以字符\alpha结尾的最长匹配子串的长度
        dp = [0] * 26
        # 第二步,状态初始化。dp[s[0]]=1
        dp[ord(s[0]) - ord('a')] = 1
        # 第三步,状态转移。dp[\alpha]=max(dp[\alpha],dp[\alpha-1]+1)。使用length维护以当前的s[i]结尾的最长子串的长度
        length = 1
        for i in range(1, n):
            index = ord(s[i]) - ord('a')
            if index == (ord(s[i - 1]) - ord('a') + 1) % 26:
                length += 1
                dp[index] = max(dp[index], length)
            else:
                length = 1
                dp[index] = max(dp[index], 1)
        # 第四步,sum(dp)即为题解
        return sum(dp)

4.执行结果

觉得有帮助可以投喂下博主哦~感谢!

作者:geek007

转载请注明文章地址及作者哦~
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇