請從字符串中找出一個最長不含重復字符的子字符串,計算該最長子字符串的長度。例如字符串“arabcacfr”中,最長不含重復字符的子字符串是“acfr”,長度為4。
思路:cur當前最長,max全局最長;hash數組記錄字符對應下標;遍歷字符串,如果字符對應hash值小於0,說明字符未出現,cur直接+1即可;如果大於等於0出現了說明重復字符,那就需要判斷,如果兩次出現長度差d大於cur說明重復字符不在當前cur長的字符串中,無需在意,cur+1即可,如果d小等於cur,說明重復字符在當前cur長的字符串匯中,需要重新計算最長長度,找規律可得cur = d。注意更新max。
int longestSubStringWithoutDuplication(const string &str) { if (str.size() == 0) { return 0; } //歷史最長,當前最長 int max = 0, cur = 0; vector hash(26, -1); //遍歷每一個字符 for (int i = 0; i < str.size(); i++) { int preidx = hash[str[i] - 'a']; //之前為存儲過或者重復字符距離大於當前最長未重復距離,則cur++; if (preidx < 0 || i - preidx > cur) { cur++; } //存儲過,且在重復 else { cur = i - preidx; //(i-1) - preidx + 1; } //存儲字符對應的下標索引 hash[str[i] - 'a'] = i; if (cur > max) { max = cur; } } return max; }