第二次
C++:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int length = 0;
string subs;
for (char c: s) {
if (subs.find(c) == string::npos) {
subs += c;
length = max(length, int(subs.size()));
} else
subs = subs.substr(subs.find(c)+1) + c;
}
return length;
}
};
python:
class Solution(object):
def lengthOfLongestSubstring(self, s):
substr = ''
length = 0
i = 0
for i in range(0, len(s)):
if substr.find(s[i]) == -1:
substr = substr + s[i]
length = max(length, len(substr))
else:
substr = substr[substr.find(s[i])+1:] + s[i]
return length
第一次
dp[i]代表自下标j (j<=i)起,到i的Longest Substring Without Repeating Characters.
已知dp[i-1], 则从i-1开始,往前遍历至i-dp[i-1], 看是否有重复的元素(下标为j);
若有,dp[i] = i-j;
反之,dp[i] = dp[i-1] + 1;
for (int j = i-1; j>=i-dp[i-1]; -- j)
{
if (s[i] == s[j])
{
dp[i] = i-j;
break;
}
}
// dp[i]初始化为0, 此时仍为0则表示未发现其与之前的[i-dp[i-1], i-1]这条子串中有相同的元素,即if没被执行
dp[i] = dp[i]==0? dp[i-1]+1: dp[i];
代码:
class Solution
{
public:
int lengthOfLongestSubstring(string s)
{
if (s.size()==0)
{
return 0;
}
vector<int> dp(s.size(), 0);
int max=1;
dp[0] = 1;
for (int i = 1; i < s.size(); ++ i)
{
for (int j = i-1; j>=i-dp[i-1]; -- j)
{
if (s[i] == s[j])
{
dp[i] = i-j;
break;
}
}
dp[i] = dp[i]==0? dp[i-1]+1: dp[i];
max = dp[i]>max? dp[i]: max;
}
return max;
}
};