一、題目描述
請從字串中找出乙個最長的不包含重複字元的子字串,計算該最長子字串的長度。假設字串中只包含′a′′a′~′z′′z′的字元。例如,在字串"arabcacfr""arabcacfr"中,最長的不含重複字元的子字串是"rabc""rabc"或者"acfr""acfr",長度為4.
二、解題思路
1.採用動態規劃求解
定義函式f(i)f(i)表示第ii個字元為結尾的不包含重複字元的子字串的最大長度。
如果第ii個字元在0~(i-1)位置沒有出現過,那麼有f(i)=f(i−1)+1;
如果第ii個字元在之前出現出,且距離它上一次出現的位置有距離d<=f(i−1),那麼可以得到f(i)=d;
如果第ii個字元在之前出現過,且距離它上一次出現的位置有距離d>f(i−1),那麼可以得到f(i)=f(i)+1;
**:
// 最長不含重複字元的子字串
int longestsubstringwithoutduplication(const string& str)
else
dp[i] = dp[i - 1] + 1;
// 存下每個字母本次出現的位置
last_pos[str[i] - 'a'] = i;
maxx = max(maxx, dp[i]);
}return maxx;
}
2、使用點陣圖及快慢指標
使用位圖(不知道位圖可以點這裡)及快慢指標來查詢子串,位圖儲存快慢指標之間的字元。
使用快慢指標:
(1)慢指標不動,快指標先走,每走一步,判斷快指標所指字元在位圖中是否已經存在,不存在,儲存字元資訊並繼續走,直到快指標指向重複字串;
(2)若此時快指標 - 慢指標 > 已經記錄的字串長度,更新字串長度;
(3)快指標不動,慢指標開始走,每走一步,將位圖中對應的字元資訊刪除,直至快慢指標所指的字元相同(此時快慢指標依舊是錯開的,慢指標指向快指標這個字元出現的第一次,快指標指向的是字元出現第二次),此時不刪除該字元的資訊,慢指標直接加加;
(4)重複步驟(1)、(2)、(3),直至快指標走到字串尾,當快指標指向尾,再判斷一次步驟2,返回子串串長度。
int lengthoflongestsubstring(char* s) ;//並沒有真的用位圖,只是點陣圖的思想
while (*end != '\0')
else
while (*start != *end)
start++;
}end++;
}if (end - start > count)
return count;
}
最長不含重複字元的子字串
題目 輸入乙個字串,找出字串中最長的不含重複字元的子字串,計算該子字串的長度。假設字串中的字元為 a z 例如 arabcacfr 最長的字串為 rabc 和 acfr 長度為 4 int find max len string str else dp str i a i return max le...
最長不含重複字元的子字串
題目 請從字串中找出乙個最長的不包含重複字元的子 字串,計算該最長子字串的長度。假設字串中只包 含 a z 的字元。例如,在字串 arabcacfr 中,最長的不含重複字元 的子字串是 acfr 長度為 4。分析 f i 表示第i個字元為結尾的不包含重複字元的子字串的最大長度。如果第i個字元之前沒有...
最長不含重複字元的子字串
請從字串中找出乙個最長的不包含重複字元的子字串,計算該最長子字串的長度。假設字串中只包含從 a 到 z 的字元。例如,在字串中 arabcacfr 最長非重複子字串為 acfr 長度為4。暴力,o n o n 分析 維持乙個記憶空間,記錄不重複時的最大長度,然後依次加入新字元,如果加入的字元重複了則...