题. 最长不含重复字符的子字符串
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
假设字符串中只包含从 a 到 z 的字符。
数据范围
输入字符串长度 [0,1000]。
样例
输入:"abcabc"
输出:3
【题解】--- 动态规划
动态规划,用f(i)
表示以i个字符结尾不包含重复子字符串的最长长度,从左向右扫描
1、若第i个字符在之前没出现过,则 f(i) = f(i-1) + 1
;
2、若第i个字符在之前出现过,
计算第i个字符距离上次出现之间的距离为d
(a)若d <= f(i-1),则说明第i个字符上次出现在f(i-1)
对应的不重复字符串之内,那么这时候更新 f(i) = d
;
(b)若d > f(i-1),则无影响,f(i) = f(i-1) + 1
;
复杂度分析:
本题的动态规划时间复杂度为O(n)。
C++代码实现:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if (s.length() == 0)
return 0;
int curLen = 0, maxLen = 0;
int* position = new int[26];
for (int i = 0; i < 26; i++)
position[i] = -1;
for (int i = 0; i < s.length(); i++){
int preIndex = position[s[i] - 'a'];
if (preIndex < 0 || i - preIndex > curLen) // 未出现过,或d>f(i-1)
curLen++;
else{ // 出现过
if (curLen > maxLen)
maxLen = curLen;
curLen = i - preIndex // f(i) = d
}
position[s[i] - 'a'] = i;
}
if (curLen > maxLen)
maxLen = curLen;
delete[] position;
return maxLen;
};