題目連結: https://zerojudge.tw/ShowProblem?problemid=d194

# 解題思路

使用 L 與 R 紀錄子字串的左右邊界,使用 set 記憶目前 in[L]in[R] 的數字, 當新加入 L[R] 與 set 中元素重複,就記錄目前的 L-R 的值是否比較大,依序從 set 中刪除 in[L] 往後的元素刪除直到 L[R] 不重複,繼續讀取 L[R] 以後的字元

(這題用 queue 好像比較方便...)

# 程式碼

#include <bits/stdc++.h>
using namespace std;
int in[1000001];
int main(){
	set<int> s;
	int ca,n,a,maxlen,L,R;
	cin >> ca;
	for(int i=0;i<ca;i++){
		cin >> n;
		s.clear();
		for(int i=0;i<n;i++)
			cin >> in[i];
		L=0,R=0,maxlen=0;
		while(R<n){
			if (s.count(in[R])==0){
				s.insert(in[R]);
				R++;
				maxlen=max(maxlen,R-L);
			}else
				while(s.count(in[R])>0){
					s.erase(in[L]);
					L++;
				}
		}
		cout << maxlen<<endl;
	}
}
更新於 閱讀次數

用實際行動犒賞爆肝的我😀

Zrn Ye LinePay

LinePay