題目描述
給定只含01的字符串,找出最長平衡子串的長度(平衡串:包含0和1的個數相同),串長最大10^6
輸入
一個字符串,只包含01,長度不超過1000000
輸出
一行一個整數,最長的0與1的個數相等的子串的長度。
2018北郵的壓軸題,想了蠻久的,個人認爲主要的點在於,我們可以將0換成-1,然後求前綴和數組dp
,這樣當的時候,這個區域內肯定是一個平衡子串,那麼問題就變成了求時的最大值。我們只需要用一個map,記錄所有首次出現的位置,再找到一個時,二者維護的最長平衡字串長度爲。
int main() {
string s;
int dp[MAX]; dp[0] = 0;
while (cin>>s)
{
s = ' ' + s;
map<int, int> m;
m[0] = 0;
for (int i = 1; i < s.size(); i++) {
if (s[i] == '0')dp[i] = dp[i - 1] - 1;
else dp[i] = dp[i - 1] + 1;
if (m.find(dp[i]) == m.end())
m[dp[i]] = i;//記錄最早出現的這些值的位置
}
int res = 0;
for (int i = 1; i < s.size(); i++) {
int l = m[dp[i]];
if (i - l > res)res = i - l;
}
cout << res << endl;
}
}