NO.1371 每个元音包含偶数次的最长子字符串 中等
暴力解法,枚举每个子串,然后遍历子串记录其中元音字母的出现情况,记录符合要求的最长子串,O(n^3)超时。
然后看见子串,就想到了滑动窗口,滑了半天也没滑出来结果。
看别人的题解,时刻提醒这自己勤能补拙!
思路一:动态规划+状态压缩 直接说结果,用五个二进制位来分别表示 aeiou 的出现次数,出现偶数次对应位是 0,计数次对应位是 1,所以这个表示范围是 00000~11111
,即十进制的 0~31
共 32 种状态 status。
因此状态数组 dp[status] 表示出现当前状态的子串的结尾下标,例如:
status 是二进制的 01010 表示 eo 出现计数次、aiu 出现偶数次,此时的 status=10
如果 dp[status]=8 ,表示出现当前状态的子串的结尾下标是 8 ,下次再出现同样的状态时用 当前下标 i - dp[status] +1
即可得到第 i 元素作为结尾符合要求的最长子串。
综上所述 dp[status] 数组的含义是:status 状态子串的结尾下标。
初始化:dp[0] = 0 即空串的状态为 00000,其余都填充为 -1。
1 | public int findTheLongestSubstring(String s) { |
时间复杂度:O(n)
空间复杂度:O(1)
本人菜鸟,有错误请告知,感激不尽!
更多题解和源码:github