Solution
动态规划。 f(i)表示包含第i个字符的最长子串。
-
如果第i个字符没在之前出现过,那么f(i) = f(i - 1) + 1
-
如果第i个字符在之前出现过,这个时候应该分两种情况,假设与之前出现的距离为d,如果d>f(i - 1) 说明之前出现的字符不在f(i - 1)包含的字符串内,那么f(i) = f(i - 1) + 1, 如果d <= f(i - 1),说明包含的重复字符在f(i - 1)内,那么f(i) = d.
Code
class Solution {
public:
int find_str(string str) {
int len = str.length();
if (len <= 1)
return len;
map<char, int> table;
vector<int> dp(len, 0);
table[str[0]] = 0;
dp[0] = 1;
int res = 1;
for (int i = 1; i < len; i++) {
if (table.find(str[i]) != table.end()) {
int d = i - table[str[i]];
if (d <= dp[i - 1])
dp[i] = d;
else
dp[i] = dp[i - 1] + 1;
} else {
dp[i] = dp[i - 1] + 1;
}
if (dp[i] > res)
res = dp[i];
table[str[i]] = i;
}
return res;
}
};