题解:https://leetcode-cn.com/problems/find-the-longest-substring-containing-vowels-in-even-counts/solution/c-qian-zhui-he-zhuang-tai-ya-suo-xiang-jie-by-yizh/

首先题目中要求子字符串中每个元音字母恰好出现偶数次,我们就可以使用 0 和 1 来标识每个字母的状态(偶数次或奇数次),我们不需要知道每个字母出现的完整次数,只需要知道这个次数的奇偶性

那么我们可以注意到奇数次 + 1 = 偶数次,偶数次 + 1 = 奇数次,所以我们可以使用 异或 来参与运算: 比如 aba

初始时 status = 00000,然后到 a 的时候 00000 ^ 00001 = 00001,1 说明 a 出现奇数次

然后到 b 的时候 00001 ^ 00010 = 00011,两个 1 说明 a、b 都出现奇数次

最后到 a 的时候 00011 ^ 00001 = 00010,说明只有 b 出现奇数次了。

以上也说明我们确实是可以使用状态码去标识每个元音字母出现次数的奇偶性。

那么我们怎么去统计最长子串的长度呢?

首先我们先盘盘哪些子串符合要求,因为现在每个下标对应的状态码其实也就只有 0 和 1

如果坐标 i 对应的状态码是 00011,坐标 j 对应的状态码是 00011,那么他们俩中间的元音字母数一定是偶数,如果某一位不相同,那么绝对不可能是偶数,因为偶数-奇数=奇数,奇数-偶数=奇数

所以我们每次求出一个坐标的状态码的时候就去瞅瞅这个状态码前面是否存在,如果存在,那么就计算一下之间子字符串的长度就 ok 了,那么我们还需要啥?明显需要一个hash表,存储每个状态码对应的下标!当然因为我们状态码最长也就是 11111 = 2^5 - 1 = 31,开一个 32 大小的数组就好了。
因为是学习官方题解写的,代码也差不多,这个代码确实是比较简洁清晰的,也没必要去复盘。

class Solution {
public:int findTheLongestSubstring(string s) {int res = 0,dis = 0;/*前缀区间定义,00000代表五元音全偶*/int bitArray = 0;//uoiea//11111 = 2^0 + 2^1 + 2^2 + 2^3 + 2^4 = 1 + 2 + 4 + 8 + 16 = 31map<int, int> bit_to_site;map<int, int>::iterator iter;bit_to_site.insert({0,-1});for(int i = 0; i < s.size(); i++){char c = s[i];switch(c){case 'a': bitArray ^= 1<<0; break;case 'e': bitArray ^= 1<<1; break;case 'i': bitArray ^= 1<<2; break;case 'o': bitArray ^= 1<<3; break;case 'u': bitArray ^= 1<<4; break;default:break;}iter = bit_to_site.find(bitArray);if(iter == bit_to_site.end()){bit_to_site.insert({bitArray, i});}dis = i - bit_to_site[bitArray];res = max(dis,res);}return res;}
};

1371. 每个元音包含偶数次的最长子字符串相关推荐

  1. leetcode 1371.每个元音包含偶数次的最长子字符串(find the longest substring containing vowels in even counts)C语言

    leetcode 1371.每个元音包含偶数次的最长子字符串(find the longest substring containing vowels in even counts)C语言 1.des ...

  2. leetcode-每日打卡-1371. 每个元音包含偶数次的最长子字符串

    1371. 每个元音包含偶数次的最长子字符串 难度:中等 给你一个字符串 s ,请你返回满足以下条件的最长子字符串的长度:每个元音字母,即 'a','e','i','o','u' ,在子字符串中都恰好 ...

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

    https://leetcode-cn.com/problems/find-the-longest-substring-containing-vowels-in-even-counts/ 这道题一开始 ...

  4. LeetCode第1371题:每个元音包含偶数次的最长子字符串(中等)

    LeetCode第1371题:每个元音包含偶数次的最长子字符串(中等) 题目:给你一个字符串 s ,请你返回满足以下条件的最长子字符串的长度:每个元音字母,即 'a','e','i','o','u' ...

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

    每个元音包含偶数次的最长子字符串 ❤️ ❤️ 中等 题目介绍 给你一个字符串 s ,请你返回满足以下条件的最长子字符串的长度:每个元音字母,即 'a','e','i','o','u' ,在子字符串中都 ...

  6. Leetcode--1371. 每个元音包含偶数次的最长子字符串(Java)

    给你一个字符串 s ,请你返回满足以下条件的最长子字符串的长度:每个元音字母,即 'a','e','i','o','u' ,在子字符串中都恰好出现了偶数次. 示例 1: 输入:s = "el ...

  7. 每个元音包含偶数次的最长子字符串——打死我也想不到的代码

    这道题目,官方给出的题解,打死我也想不到.原题目地址 给你一个字符串 s ,请你返回满足以下条件的最长子字符串的长度:每个元音字母,即 'a','e','i','o','u' ,在子字符串中都恰好出现 ...

  8. [leetcode]5337. 每个元音包含偶数次的最长子字符串

    前缀和,下次记住前缀和,从1开始存,cnt[0] 存0 class Solution {public:int findTheLongestSubstring(string s) {int len = ...

  9. leetcode: 每个元音包含偶数次的最长字符串(前缀和 + 状态压缩(位运算、hash优化))*

    题目:给你一个字符串 s ,请你返回满足以下条件的最长子字符串的长度:每个元音字母,即 'a','e','i','o','u' ,在子字符串中都恰好出现了偶数次. PS: 1 <= s.leng ...

最新文章

  1. LINUX CP命令
  2. bash 脚本_Bash技巧:可以左右下移动和旋转俄罗斯方块的Shell脚本
  3. 工具-Xmind常用快捷键/使用
  4. list java语法_java基础语法 List
  5. 山东青岛市南区:创建物联网 信息化管理涉案财物
  6. 天梯 L2 这是二叉搜索树吗?
  7. 操作系统上机作业--使用条件变量解决生产者、计算者、消费者问题(多线程)
  8. Hibernate3.X实现基于CLOB字段类型的注解方式:
  9. Linux 查看 MySQL 版本的四种方法
  10. 利用jemalloc分析内存泄漏以及LD_PRELOAD
  11. struts2.xml中使用chain和redirectAction这两个类型结果(type-result)时,报检查错误(validation)...
  12. matlab三维数据转置,【转】求matlab三维数组转置函数
  13. 幻灯片转换html动画,html5 css3仿ppt幻灯片播放动画效果
  14. kettle 学习笔记
  15. bootstrap 动态横向时间轴_jquery纵向时间轴插件_Bootstrap响应两侧时间轴特效代码Timeline...
  16. 关于临时HY学长被安排拉二分题不想翻译找到DYM学长这件事(二)
  17. 宇宙的本源—存在之道和变化之道
  18. 网站中PV、UV、IP的区别
  19. ImgURL一款简单纯粹的图床程序源码
  20. Microsoft Access 数据库和表

热门文章

  1. BitCoin Gloom系列
  2. 多线程-AbstractQueuedSynchronizer(AQS)
  3. oracle之完整性约束
  4. 【转】const_cast
  5. .NET 设计规范--.NET约定、惯用法与模式--5.成员设计
  6. Linux 命令(82)—— chgrp 命令
  7. 常见解压缩软件与其zip格式
  8. 定时任务@Scheduled(cron = “* * * * * *?“) 表达式详解
  9. 跟着开涛springmvc学习(转)
  10. js中如何优雅的写if判断