秋招每日一题T30——每个元音包含偶数次的最长子字符串

给定字符串s,求最长子字符串长度,要求每个元音(a, e, i, o, u)出现偶数次。采用状态压缩法,用位图记录状态,线性遍历字符串,遇到元音更新状态并记录最长子串。" 121052758,7871006,使用ELK搭建日志搜索平台,"['大数据', '日志分析', 'elasticsearch', 'logstash', 'kibana']
摘要由CSDN通过智能技术生成

题目描述

给你一个字符串 s ,请你返回满足以下条件的最长子字符串的长度:每个元音字母,即 ‘a’,‘e’,‘i’,‘o’,‘u’ ,在子字符串中都恰好出现了偶数次。
在这里插入图片描述
在这里插入图片描述

思路

①由于问题的规模在5×105,因此需要使用O(n)的算法,否则在leetcode上会TLE。
②使用的算法是状态压缩,由于本题所判断的最长子列,需要五个元音字母出现偶数次,偶数次有以下性质:

  • 0次也算偶数次,因此如果一个字符串从未出现过元音字母,那么它自身便是最长的子串。
  • 当前状态下,如果某个元音字母再次出现偶数次,那么它的状态是不变的,因为偶数 + 偶数还是偶数。只有当遇到奇数次时,状态才会改变。
  • 因此可以使用一个位图来记录某个状态上一次出现在哪个位置,一共有32个状态,即位图的00000~11111
  • 从头到尾线性遍历字符串,如果出现元音字母,寻找上一次(或者说,第一次出现的位置)它出现的位置。
  • 直到下一次状态改变之前,前面的子串如果满足条件,那么就是最长的子串。出现偶数次不会改变状态&#
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值