最長AB子串 - LintCode

描述
給你一個只由字母’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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章