北京郵電大學2018年機試題-最長平衡串

題目描述

給定只含01的字符串,找出最長平衡子串的長度(平衡串:包含0和1的個數相同),串長最大10^6

輸入

一個字符串,只包含01,長度不超過1000000

輸出

一行一個整數,最長的0與1的個數相等的子串的長度。


2018北郵的壓軸題,想了蠻久的,個人認爲主要的點在於,我們可以將0換成-1,然後求前綴和數組dp,這樣當dp[i]==dp[j]dp[i]==dp[j]的時候,dp[i+1]dp[j]dp[i+1]-dp[j]這個區域內肯定是一個平衡子串,那麼問題就變成了求dp[i]==dp[j]dp[i]==dp[j]jij-i的最大值。我們只需要用一個map,記錄所有dp[k]dp[k]首次出現的位置,再找到一個dp[i]==dp[k]i>kdp[i]==dp[k]|i>k時,二者維護的最長平衡字串長度爲iki-k

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