最長不重複子串 (哈希 + DP)

自己沒想出來, 代碼來自別人的博客, 但是找不到出處了…


代碼實現


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;
}

大概流程

  1. 假設有字符串aabdcdde, 那麼我們一次遍歷, previous記錄上一個不重複子串的終點爲 -1, 得到首字符組成的子串長度爲 1, 然後更新lastPosition['a']的值爲 0
  2. 然後遍歷到 i = 1 時, a 此時重複出現在當前子串中, previous更新爲其上一出現位置的下標 (即 0), 計算的當前不重複子串長度爲 1, previous值變爲 0, lastPosition['a']的值更新爲 1,
  3. 這樣一直遍歷直到碰到第二個d, 即遇到重複字符了, 遇到他之前我們已經記錄了之前不重複子串的長度, 即abdc, 遇到他之後previous更新爲其上一次出現的位置, 然後計算從previous到其當前位置的子串長度, 和maxLength比較
  4. 循環上述過程直到遍歷完字符串, maxLength中就是最長不重複子串長度
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章