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)
#这样只会打印出一个

浙公网安备 33010602011771号