
比較巧妙的一道題,是練習(xí)位操作的不錯(cuò)的題目,解題思路很是,若兩數(shù)相減為偶,則兩數(shù)同奇或同偶,奇偶性質(zhì)的記錄可以用異或操作可以表示,另外用一個(gè)hash表來(lái)表示各種奇偶情況對(duì)應(yīng)的最短的子字符串長(zhǎng)度,然后在下一次出現(xiàn)相同奇偶情況時(shí),去減去相對(duì)應(yīng)的最短子字符串長(zhǎng)度,這樣就可以保證減出來(lái)的結(jié)果中,每個(gè)元音都出現(xiàn)偶數(shù)次了,然后把其中長(zhǎng)度最長(zhǎng)的return出來(lái)即可,代碼:
class Solution {
public:
? ? int findTheLongestSubstring(string s) {
? ? ? ? vector<int> record_list(32, -2);
? ? ? ? int status = 0, result = 0;
? ? ? ? record_list[0] = -1;
? ? ? ? for (int i = 0; i < s.length(); i ++) {
? ? ? ? ? ? if (s[i] == 'a')
? ? ? ? ? ? ? ? status ^= 1 << 0;
? ? ? ? ? ? if (s[i] == 'e')
? ? ? ? ? ? ? ? status ^= 1 << 1;
? ? ? ? ? ? if (s[i] == 'i')
? ? ? ? ? ? ? ? status ^= 1 << 2;
? ? ? ? ? ? if (s[i] == 'o')
? ? ? ? ? ? ? ? status ^= 1 << 3;
? ? ? ? ? ? if (s[i] == 'u')
? ? ? ? ? ? ? ? status ^= 1 << 4;
? ? ? ? ? ? if (record_list[status] >= -1)
? ? ? ? ? ? ? ? result = max(result, i - record_list[status]);
? ? ? ? ? ? else
? ? ? ? ? ? ? ? record_list[status] = i;
? ? ? ? }
? ? ? ? return result;
? ? }
};