最長連續不重複子序列

2021-10-25 11:52:59 字數 945 閱讀 7347

核心思路:

遍歷陣列a中的每乙個元素a[i], 對於每乙個i,找到j使得雙指標[j, i]維護的是以a[i]結尾的最長連續不重複子序列,長度為i - j + 1,將這一長度與result的較大者更新給result。

對於每乙個i,如何確定j的位置:由於[j, i - 1]是前一步得到的最長連續不重複子序列,所以如果[j, i]中有重複元素,一定是a[i],因此右移j直到a[i]不重複為止(由於[j, i - 1]已經是前一步的最優解,此時j只可能右移以剔除重複元素a[i],不可能左移增加元素,因此,j具有「單調性,i更不可能右移,因為已經有重複元素了,再右移還是有重複元素)。

陣列s記錄子串行a[j ~ i]中各元素出現次數,遍歷過程中對於每乙個i有四步操作:cin元素a[i] -> 將a[i]出現次數s[a[i]]加1 ->若a[i]重複則右移j(s[a[j]]要減1)-> 確定j及更新當前長度i - j + 1給result。

注意細節:

當a[i]重複時,先把a[j]次數減1,再右移j。

最長連續不重複子序列

給定乙個長度為n的整數序列,請找出最長的不包含重複數字的連續區間,輸出它的長度。第一行包含整數n。第二行包含n個整數 均在0 100000範圍內 表示整數序列。共一行,包含乙個整數,表示最長的不包含重複數字的連續子串行的長度。1 n 100000 51 2 2 3 5 暴力 for int i 0 ...

最長不重複子序列

其實是一道典型的雙指標問題,只要一直往後去輸入資料,如果遇到重複的資料,就讓begin指標往後移,直到重複的元素不再子串行內,在讀入新資料就可以了,每次遇到重複資料就把maxlength和當前的length比較去大值,就可以了 include include include include incl...

最長連續不重複子序列(雙指標)

給定乙個長度為n的整數序列,請找出最長的不包含重複數字的連續區間,輸出它的長度。輸入格式 第一行包含整數n。第二行包含n個整數 均在0 100000範圍內 表示整數序列。輸出格式 共一行,包含乙個整數,表示最長的不包含重複數字的連續子串行的長度。資料範圍 1 n 100000 輸入樣例 51 2 2...