新增5 最長不含重復字符的子字符串


請從字符串中找出一個最長不含重復字符的子字符串,計算該最長子字符串的長度。例如字符串“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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM