題目連結: 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; | |
} | |
} |