题目要求:
算法分析
条件: 每个元音字母,'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 }
提交结果
一些感想
这是我的第一篇算法分析,并且我也是刚开始接触算法,有些地方表述的很糟糕,希望大佬们不吝指教,同时也希望我每天都能进步.