動態規劃-最長不含重複字符的子字符串

// 面試題48:最長不含重複字符的子字符串 // 題目:請從字符串中找出一個最長的不包含重複字符的子字符串,計算該最長子 // 字符串的長度。假設字符串中只包含從'a'到'z'的字符。
 #include <string> #include <iostream>
動態規劃
int longestSubstringWithoutDuplication_2(const std::string& str) { int curLength = 0;//記錄當前長度
    int maxLength = 0;//記錄最大長度

    int* position = new int[26];//檢測26個字母上次出如今字符串下標,沒有用過爲-1
    for (int i = 0; i < 26; ++i) position[i] = -1; for (int i = 0; i < str.length(); ++i) { int prevIndex = position[str[i] - 'a']; if (prevIndex < 0 || i - prevIndex > curLength)//若是這個值以前沒有被用過,或者用過可是兩者相同字符的距離比當前記錄的長度要大(這說明這個字符再也不當前統計的範圍內)
            ++curLength; else { if (curLength > maxLength) maxLength = curLength; curLength = i - prevIndex;//不然將兩者相同字符的距離替換當前記錄的長度
 } position[str[i] - 'a'] = i;//記錄這個字符的位置爲i
 } if (curLength > maxLength)//記錄到結束了,要比較一下最後一段的長度是不是最長的
        maxLength = curLength; delete[] position; return maxLength; }
相關文章
相關標籤/搜索