leetcode_無重複字元的最長子串
阿新 • • 發佈:2021-07-13
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(intj = 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; } };