• 1371. 每个元音包含偶数次的最长子字符串


    给你一个字符串 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 次。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/find-the-longest-substring-containing-vowels-in-even-counts

    其实看到奇数偶数我首先想到的是xor,用 5 位的二进制来表示各个元音的奇偶性,  0 表示偶数,1 表示奇数,并且最低位表示 a,然后依次是 e,i,o,u。写了一下发现是

    前缀和 + 状压+XOR

    class Solution:
        def findTheLongestSubstring(self, s: str) -> int:
            mapper={"a":1,"e":2,"i":4,"o":8,"u":16}
            vis={0:-1}
            res=cur=0
    
            for i in range(len(s)):
                if s[i] in mapper:
                    cur^=mapper.get(s[i])
                if cur in vis:
                    res=max(res,i-vis.get(cur))
                else:
                    vis[cur]=i
        
            return res

    其实这道题暴力+一个小trick可以过

    class Solution:
        def findTheLongestSubstring(self, s: str) -> int:
            for i in range(len(s), 0, -1):
                for j in range(len(s) - i + 1):
                    sub = s[j:j + i]
                    odd_vowel = False
                    for vowel in ['a', 'e', 'i', 'o', 'u']:
                        if sub.count(vowel) % 2 != 0:
                            odd_vowel = True
                            break
                    if not odd_vowel: return  i
            return 0

    从最长的子串开始枚举,这样找到一个满足条件的直接返回就行了

  • 相关阅读:
    java修改应用程序标题栏
    电动双轮车
    Oracle执行计划相关(待补充)
    SQL中IN和EXISTS用法的区别
    union all与union all
    equals与hashcode
    文件上传的整个流程
    adwords与adsence
    struts2文件上传大小
    为什么是UUID做主键
  • 原文地址:https://www.cnblogs.com/xxxsans/p/13376919.html
Copyright © 2020-2023  润新知