给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:
给定 "abcabcbb"
,没有重复字符的最长子串是 "abc"
,那么长度就是3。
给定 "bbbbb"
,最长的子串就是 "b"
,长度是1。
给定 "pwwkew"
,最长子串是 "wke"
,长度是3。请注意答案必须是一个子串,"pwke"
是 子序列 而不是子串。
先来一个错误示例
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int num, max = 0, n = s.length();
set<char> str;
for(int i = 0; i < n; i++)
{
if(str.find(s[i]) != str.end())
{
str.erase(str.begin(),str.find(s[i]));
}
str.insert(s[i]);
num = str.size();
if(num > max)
max = num;
}
return max;
}
};
用了SET容器,觉得自己挺不错的,abcabcbb测试也没有问题,但是“ynyo”测试出错,应该为3,输出为2。
后来想到set会排序,yn存进去会变为ny。
改用LIST,++x和x++要区分
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int num, max = 0, n = s.length();
list<char> str;
for(int i = 0; i < n; i++)
{
list<char >::iterator FindIterator;
FindIterator = find(str.begin(), str.end(), s[i]);
if(FindIterator != str.end())
{
str.erase(str.begin(),++FindIterator);
}
str.push_back(s[i]);
num = str.size();
if(num > max)
max = num;
}
return max;
}
};
C++版
更新,用list多此一举,直接用string就行
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int num, max = 0;
string str;
for(int i = 0; i < s.length(); i++)
{
if(str.find(s[i]) != string::npos)
{
str.erase(0, str.find(s[i])+1);
}
str += s[i];
num = str.size();
if(num > max)
max = num;
}
return max;
}
};
Python版
class Solution:
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
str = ""
count = 0
maxx = 0
for i in s:
a = str.find(i, 0, len(str))
if a > -1 :
str = str.lstrip(str[0:a+1])
str = str + i
if maxx < len(str) :
maxx = len(str)
return maxx