Leetcodeインタビューの質問48.繰り返し文字のない最長の部分文字列[動的プログラミング]

問題の説明

文字列から文字を繰り返さずに最も長い部分文字列を見つけ、最も長い部分文字列の長さを計算してください。

問題解決レポート

d p [ ] dp [i] 文字で終わる最長のサブストリングの長さ。
覚えて d p [ 1 ] dp [i-1] 開始位置は p p
シーク d p [ ] dp [i]

  • 逆走査 s [ 1 ] s [ 2 ] s [ p ] s [i-1]、s [i-2]、\ cdots、s [p]
  • 存在しない場合 s [ j ] = = s [ ] s [j] == s [i] 、次に d p [ ] = d p [ 1 ] + 1 dp [i] = dp [i-1] +1 p p は変更されません。
  • 存在する場合 s [ j ] = = s [ ] s [j] == s [i] 、次に d p [ ] = j dp [i] = ij その間、 p p 更新されます j j

時間の複雑さ: N O(N) 、最悪は N 2 O(N ^ 2)
スペースの複雑さ: N O(N)

実装コード

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int n=s.size(),ans=1,flag=0,i,j,p=0;
        if(n==0) return 0;
        vector<int>dp(n,1);
        for(i=1;i<n;i++){
            for(j=i-1;j>=p;j--){
                if(s[i]==s[j]){
                    flag=1;
                    break;
                }
            }
            if(!flag)
                dp[i]=dp[i-1]+1;
            else{
                dp[i]=i-j;
                p=j;
                flag=0;
            }
            ans=max(ans,dp[i]);
        }
        return ans;
    }
};

参考文献

[1] Leetcodeインタビューの質問48.繰り返される文字のない最長の部分文字列

MD_
139の元の記事を公開 賞賛8 10,000+ビュー

おすすめ

転載: blog.csdn.net/qq_27690765/article/details/105439787