用visit陣列記錄出現過的地方
dp的時候注意乙個問題就可以:
abcdacbd來看看如果遇到重複的該怎麼處理:
遇到第二個a前都沒有問題,第二次遇到a,然後肯定是更新a的位置的dp[4] = 4-0 = 4,
第二次遇到c, 更新c的位置為dp[5] = 5-2 = 3;
然後問題來了,第二次遇到b,從第乙個b和第二個b之間已經重複c了,所以只能更新dp[6] = dp[5]+1,所以這裡的問題在於,如何標記dp[i]=dp[i-1]+1還是dp[i]=i-visit[a[i]]..............所以這裡判斷的方法就是,使用乙個指標last標記剛剛更新過的地方,比如更新c後,標記last = 2(就是第乙個c),然後
if(visit[a[i]] < last)//說明第乙個b和第二個b直接有c重複了
dp[i] = dp[i-1]+1
;else
dp[i] = i -visit[a[i]];
last = visit[a[i]];
/*lnrs dp + hash 優化
*/void lnrs_dp_hash_impro(char * arr, int
size)
else
else
}if(curlen >maxlen)
}output(arr);
}
最長不重複子串
出處 勇幸 thinking 題 從乙個字串中找到乙個連續子串,該子串中任何兩個字元不能相同,求子串的最大長度並輸出一條最長不重複子串。本節從最直接的方法逐步優化,漸進探索了四種實現方式,並最終找到時間複雜度為o n 輔助空間為常數的方案,內容如下 基本演算法 使用hash dp方案 dp hash...
最長不重複子串
演算法參考 找到乙個字串中的乙個連續子串,這個子串內不能有任何兩個字元是相同的,並且這個子串是符合要求的最長的。例如輸入 abcbef 輸出 cbef o n 的演算法,具體思路如下 以abcbef這個串為例,用乙個陣列pos記錄每個元素曾出現的下標,初始化為 1。從s 0 開始,依次考察每個字元,...
最長不重複子串
題目鏈結 給定乙個字串,找到最長的子串,要求該子串中沒有重複的字元。例如 字串abcabcbb的不含重複字元的 最長 子串為abc,長度為 3。而bbbbbb的不含重複字元的 最長 子串為b,長度為 1。輸入格式 輸入包含多行,每一行對應乙個長度不超過 100 的輸出,直到遇到結束符為止。每行依次輸...