描述
給你一個只由字母’A’和’B’組成的字符串s,找一個最長的子串,要求這個子串裏面’A’和’B’的數目相等,輸出該子串的長度。
這個子串可以爲空。
s的長度n滿足 2<=n<=1000000。
樣例
給定s=”ABAAABBBA”,返回8。
解釋:
子串 s[0,7] 和子串 s[1,8] 滿足條件,長度爲 8。
給定s=”AAAAAA”,返回0。
解釋:
s 中除了空字串,不存在 'A' 和 'B' 數目相等的子串。
思路
#ifndef C1443_H
#define C1443_H
#include<iostream>
#include<string>
#include<vector>
#include<unordered_map>
using namespace std;
class Solution {
public:
/**
* @param S: a String consists of a and b
* @return: the longest of the longest string that meets the condition
*/
int getAns(string &S) {
// Write your code here
if (S.find('A') == string::npos || S.find('B') == string::npos || S.empty())
return 0;
int len = S.size();
int maxLen = 0;
vector<int> vec(len);//存放當前A和B數目的差值
unordered_map<int, int> m;//存放數目差值及其最大位置
int temp = 0;
for (int i = 0; i < len; ++i)
{
if (S[i] == 'A')
temp--;
else
temp++;
vec[i] = temp;
m[temp] = i;
}
//尋找數目差爲0的區域
for (int i = 0; i < len; ++i)
{
if (vec[i] != 0)
{
maxLen = maxLen >= m[vec[i]] - i ? maxLen : m[vec[i]] - i;
}
}
//爲0返回最大位置+1
if (m.find(0) != m.end())
{
if (m[0] + 1>maxLen)
maxLen = m[0] + 1;
}
return maxLen;
}
};
#endif