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

题目要求:

算法分析

条件: 每个元音字母,'a','e','i','o','u',在子字符串中都恰好出现了偶数次

在前缀和中存储某个元音字母出现次数的奇偶性, 

若某一区间两侧的前缀和相同,则代表该字母在对应的区间内出现的次数为偶数次(奇数-奇数 = 偶数,偶数-偶数=偶数)。

同理,若前缀和中存储的是所有元音字母出现次数的奇偶性,那么对于两侧前缀和相同的区间,内部元音字母出现次数都为偶数次。

如何存储所有元音字母出现次数的奇偶性信息(以下简称信息)?

对于单个字母的信息可以用1或0表示,,1代表出现奇数次,0代表出现偶数次,

同理,对于题中的5个元音,我们可以把它们的信息组合成一个5位2进制数,取值范围是(00000)2到(11111)2,即十进制的0到31。

此时,遍历字符串,在记录前缀和的信息的同时,还要检测该信息是否已经出现过,如果出现过则计算两次索引值的差值得到满足条件的子串的长度,

最后遍历完毕后即可得到的满足条件的最大子串的长度。

代码展示(C#)

 1 public class Solution {
 2     public int FindTheLongestSubstring(string s) {
 3         int result = 0;
 4         int[] stringIndex = new int[32];
 5         for(int i = 0; i < stringIndex.Length; i++)
 6         {
 7             stringIndex[i] = -2;
 8         }
 9         stringIndex[0] = -1;
10         int vowelInfo = 0;
11         for (int i = 0; i < s.Length; i++)
12         {
13             switch (s[i])
14             {
15                 case 'a':
16                     {
17                         vowelInfo ^= 1;
18                         break;
19                     }
20                 case 'e':
21                     {
22                         vowelInfo ^= 2;
23                         break;
24                     }
25                 case 'i':
26                     {
27                         vowelInfo ^= 4;
28                         break;
29                     }
30                 case 'o':
31                     {
32                         vowelInfo ^= 8;
33                         break;
34                     }
35                 case 'u':
36                     {
37                         vowelInfo ^= 16;
38                         break;
39                     }
40                 default:
41                     {
42                         break;
43                     }
44             }//更新第i位的奇偶信息
45             if (stringIndex[vowelInfo] == -2)
46             {
47                 stringIndex[vowelInfo] = i;
48             }
49             else if(i - stringIndex[vowelInfo] > result)
50             {
51                 result = i - stringIndex[vowelInfo];
52             }
53         }
54         return result;
55     }
56 }

提交结果

一些感想

这是我的第一篇算法分析,并且我也是刚开始接触算法,有些地方表述的很糟糕,希望大佬们不吝指教,同时也希望我每天都能进步.

猜你喜欢

转载自www.cnblogs.com/KingR/p/12926627.html