发布于2020-03-10 20:58 阅读(934) 评论(0) 点赞(23) 收藏(1)
给你一个字符串 s
,请你返回满足以下条件的最长子字符串的长度:每个元音字母,即 ‘a’,‘e’,‘i’,‘o’,‘u’ ,在子字符串中都恰好出现了偶数次。
示例 1:
输入:s = "eleetminicoworoep"
输出:13
解释:最长子字符串是 "leetminicowor" ,它包含 e,i,o 各 2 个,以及 0 个 a,u 。
示例 2:
输入:s = "leetcodeisgreat"
输出:5
解释:最长子字符串是 "leetc" ,其中包含 2 个 e 。
示例 3:
输入:s = "bcbcbc"
输出:6
解释:这个示例中,字符串 "bcbcbc" 本身就是最长的,因为所有的元音 a,e,i,o,u 都出现了 0 次。
提示:
1 <= s.length <= 5 x 10^5
s
只包含小写英文字母。解题思路
这个问题和Leetcode 3:无重复字符的最长子串类似,由于只需要记录元音字符出现次数是不是偶数次,那么我们可以通过0
表示偶数,而1
表示奇数,只需要通过5bit
个数字即可表示到当前位置的所以元音字符奇偶状态。如果前后两个状态相同,那么说明这两个状态之间的元音字符个数满足条件,例如:
e l e e t m i n i c o w o r o e p
↑ ↑
l r
-----------------------------------
l: 01000
r: 01000
为了记录最长字符串,那么我们只需记录元音字符奇偶状态出现的第一个位置,例如上面这个例子,我们最后只记录l
的位置,因为l
将距离更远。
class Solution:
def findTheLongestSubstring(self, s: str) -> int:
vis = {0: -1}
vowels = collections.defaultdict(int)
for i, c in enumerate("aeiou"): vowels[c] = 1 << (i + 1) >> 1
res = cur = 0
for i, c in enumerate(s):
cur ^= vowels[c]
vis.setdefault(cur, i)
res = max(res, i - vis[cur])
return res
说明一下:上面写法中(1 << vis[c]) >> 1
比较奇特,原因在于a,e,i,o,u
可以通过1,2,4,8,16
表示,而其他字符就通过0
表示。(>>1
的目的就是不希望其他字符参与状态表示)
reference:
https://leetcode.com/problems/find-the-longest-substring-containing-vowels-in-even-counts/discuss/531840/JavaC%2B%2BPython-One-Pass
我将该问题的其他语言版本添加到了我的GitHub Leetcode
如有问题,希望大家指出!!!
作者:众神之战
链接:https://www.pythonheidong.com/blog/article/251668/a54ae5576452bb121e44/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!