1. 程式人生 > 其它 >leetcode_無重複字元的最長子串

leetcode_無重複字元的最長子串

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        if(s.length()==0)
            return 0;
        vector<int> dp(s.size(),0);

        dp[0] = 1;   // 初始狀態。
        // dp[i] 包含當前字元的子串長度
        for(int i = 1; i < s.length(); i++){
            int k = -1;
            for(int
j = 0; j <i; j++){ if(s[i] == s[j]) k = j; } if(k>=0) // dp[i] = i-k; dp[i] = min(i-k,dp[i-1]+1); // 針對abba這種情況 else dp[i] = dp[i-1] + 1; } int res = INT_MIN;
for(int i = 0; i < dp.size(); i++){ res = max(res, dp[i]); cout<<"dp:"<<dp[i]<<endl; } return res; } };

進一步優化

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        if(s.length()==0)
            return 0;
        vector
<int> dp(s.size(),0); dp[0] = 1; // 初始狀態。 // dp[i] 包含當前字元的子串長度 int start = 0; for(int i = 1; i < s.length(); i++){ int k = -1; for(int j = start; j <i; j++){ if(s[i] == s[j]){ start = j; k = j; } } if(k>=0) dp[i] = i-k; // dp[i] = min(i-k,dp[i-1]+1); // 針對abba這種情況 else dp[i] = dp[i-1] + 1; } int res = INT_MIN; for(int i = 0; i < dp.size(); i++){ res = max(res, dp[i]); cout<<"dp:"<<dp[i]<<endl; } return res; } };