加载中...

1839. 所有元音按顺序排布的最长子字符串

题目描述

当一个字符串满足如下条件时,我们称它是 美丽的 :

所有 5 个英文元音字母('a' ,'e' ,'i' ,'o' ,'u')都必须 至少 出现一次。
这些元音字母的顺序都必须按照 字典序 升序排布(也就是说所有的 'a' 都在 'e' 前面,所有的 'e' 都在 'i' 前面,以此类推)
比方说,字符串 "aeiou" 和 "aaaaaaeiiiioou" 都是 美丽的 ,但是 "uaeio" ,"aeoiu" 和 "aaaeeeooo" 不是美丽的 。

给你一个只包含英文元音字母的字符串 word ,请你返回 word 中 最长美丽子字符串的长度 。如果不存在这样的子字符串,请返回 0 。

子字符串 是字符串中一个连续的字符序列。

这道题自己能感觉是用滑动窗口,但是没有思路

代码及思路

#方式一:不用滑动窗口 想法就是把所有的连续相同字符缩减为1, 然后另外给出一个计数器,当符合‘aeiou’的时候就更新最大值。
比如:aeiaaioaaaaeiiiiouuuooaauuaeiu
缩减为:aeiaioaeiouoauaeiu 和 [1,1,1,2,1,1,4,1,4,1,3,2,2,2,1,1,1,1]
显然缩减后的字符串只有一个'aeiou'在 6-10,计数得 4+1+4+1+3 = 13
。
class Solution:
    def longestBeautifulSubstring(self, word: str) -> int:
        newword = '' #去重连续相同字符后的字符串
        cnt = []  #去重连续相同字符后的字符串对应的连续次数
        for i in range(len(word)):#遍历字符串
            if i == 0 or word[i] != word[i - 1]: #对连续不同的字符串进行记录,相同的字符的话则使连续次数+1
                newword += word[i]
                cnt.append(1)
            else:
                cnt[-1] += 1

        res = 0 #aeiou的最大长度
        for i in range(len(newword) - 4):
            if newword[i : i + 5] == 'aeiou':
                res = max(res, sum(cnt[i : i + 5]))
        return res
。
#滑动窗口方式
class Solution:
    def longestBeautifulSubstring(self, word: str) -> int:
        n = len(word) #字符串长度
        if n < 5: #如果长度都小于五,绝对没有完美子串
            return 0
        L = 0 #滑动左窗口
        R = 1 #滑动右窗口
        res = 0  #最长完美字串长度
        curr = word[0] #当前窗口
        ss = set() #用来存储字符的集合
        ss.add(word[0])
        while R < n:
            if curr > word[R]: #当当前字符ASCALL码大于右窗口,即比如当前是E,WORD[R]是a时,加上右窗口的字符不满足完美字串
                if len(ss) == 5: #查看当前字符集合中的元素个数,如果有5个,则证明到当前字符满足完美字串
                    res = max(res, R-L) #求最大完美字串的个数
                L = R #将左窗口移动到有窗口
                ss.clear() #将集合清空
            curr = word[R] #使当前字符为右窗口字符
            ss.add(word[R]) #将当前字符加入集合
            R += 1 #右窗口右移
        if len(ss) == 5:
            res = max(res, R - L)
        return res

基础知识错误

n=6
if n>5:
  print("厉害")
print("太厉害")  
   #这样写两个都会打印出来

if n>5:
   print(1)
else:
   print(2)
   #这样只会打印出一个
posted @ 2022-06-08 21:26  最大的敌人是自律  阅读(103)  评论(0)    收藏  举报