劍指offer 面試題48 最長不含重複字符的子字符串

問題:請從字符串中找出一個最長的不包含重複字符的子字符串,計算該最長子字符串的長度。

輸入:字符串

輸出:最長子字符串的長度

思路:動態規劃

定義f(i)表示以第i個字符爲結尾的不包含重複字符的子字符串的最長長度。

如果第i個字符之前沒有出現過,那麼f(i)=f(i-1)+1,

如果第i個字符之前出現過,先計算與它上次出現位置的距離,如果d小於等於f(i-1),則f(i)=d,如果d大於f(i-1),則f(i)=f(i-1)+1,

代碼:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        vector<int> index(256,-1);
        int len=s.size();
        if(len==0)
            return 0;
        vector<int> dp(len);
        dp[0]=1;
        index[s[0]-' ']=0;
        for(int i=1;i<len;++i)
        {
            int prevIndex=index[s[i]-' '];
            if(prevIndex==-1||i-prevIndex>dp[i-1])
                dp[i]=dp[i-1]+1;
            else
                dp[i]=i-prevIndex;
            index[s[i]-' ']=i;
        }
        return *max_element(dp.begin(),dp.end());
    }
};

複雜度分析:時間複雜度爲O(n),空間複雜度爲O(n).

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章