自己沒想出來, 代碼來自別人的博客, 但是找不到出處了…
代碼實現
int longestSubstring(string str)
{
//利用哈希的思想,key是每一個字符,value是其對應的下標
// 存儲上一個重複字符的位置
int* lastPosition = new int[256];
//初始化,首字符之前沒有與其重複的字符,都爲-1
for (int i = 0; i < 256; i++)
{
lastPosition[i] = -1;
}
int previous = -1; //記錄上一個不重複子串的終點
int current = 0; //記錄當前不重複子串長度
int maxLength = 0; //記錄最大不重複子串長度
int n = str.size();
for (int i = 0; i < n; i++)
{
//碰到重複字符previous更改爲該重複字符的位置
previous = max(previous, lastPosition[str[i]]);
//本次子串長度
current = i - previous;
maxLength = max(current, maxLength);
//更新該字符對應的下標
lastPosition[str[i]] = i;
}
return maxLength;
}
大概流程
- 假設有字符串
aabdcdde
, 那麼我們一次遍歷,previous
記錄上一個不重複子串的終點爲 -1, 得到首字符組成的子串長度爲 1, 然後更新lastPosition['a']
的值爲 0 - 然後遍歷到 i = 1 時, a 此時重複出現在當前子串中,
previous
更新爲其上一出現位置的下標 (即 0), 計算的當前不重複子串長度爲 1,previous
值變爲 0,lastPosition['a']
的值更新爲 1, - 這樣一直遍歷直到碰到第二個
d
, 即遇到重複字符了, 遇到他之前我們已經記錄了之前不重複子串的長度, 即abdc
, 遇到他之後previous
更新爲其上一次出現的位置, 然後計算從previous
到其當前位置的子串長度, 和maxLength
比較 - 循環上述過程直到遍歷完字符串,
maxLength
中就是最長不重複子串長度