【问题描述】
Given a string, find the length of the longest substring without repeating characters.
Examples:
Given "abcabcbb"
, the answer is "abc"
, which the length is 3.
Given "bbbbb"
, the answer is "b"
, with the length of 1.
Given "pwwkew"
, the answer is "wke"
, with the length of 3. Note that the answer must be a substring, "pwke"
is a subsequence and not a substring.
【解题分析】
这题我们用DP(动态规划)方法:准备一个足够大的vector(256位),存每个字符出现的位置,初始值都为-1;假设一个start,用来记录出现重复字符时,离当前位置最近的上一个相同字符的位置,start初始值为-1,于是当前字符位置减去start时,就是未出现重复字符的字符串的长度。时间复杂度为O(N)。
【源代码】
class Solution {
public:
int lengthOfLongestSubstring(string s) {
vector<int> dict(256,-1);
int start = -1;
int maxlength = 0;
for (int i = 0; i < s.length(); i++) {
if (dict[s[i]] > start) {
start = dict[s[i]]; /*记录出现相同字符时,离当前位置最近的上一个相同字符的位置*/
}
dict[s[i]] = i; /*更新字符s[i]最新出现的位置*/
maxlength = max(maxlength, i - start); /*更新最大长度不重复的子字符串*/
}
return maxlength;
}
};