题目链接
【题意】
给定一个字符串,找到其中的一个最长的字串,使得这个子串不包含重复的字符
【分析】
题目很简单,第一眼想到的是动态规划,另外主要是为了分享一些做法写法
C++
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.size()==0) return 0;
if(s.size()==1) return 1;
vector<int> chr(256,-1);
vector<int> dp(s.size(),-1);
dp[0] = 0;
chr[s[0]] = 0;
int max = -10000;
for(int i=1;i<s.size();i++){
if(chr[s[i]] == -1){
dp[i] = dp[i-1];
chr[s[i]] = i;
}
else{
if(chr[s[i]] < dp[i-1]){
chr[s[i]] = i;
dp[i] = dp[i-1];
}
else{
dp[i] = chr[s[i]]+1;
chr[s[i]] = i;
}
}
if(i - dp[i]>max) max = i - dp[i];
}
return max + 1;
}
};
另一种解法:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
vector<int> dict(256, -1);
int maxLen = 0, start = -1;
for (int i = 0; i != s.length(); i++) {
if (dict[s[i]] > start)
start = dict[s[i]];
dict[s[i]] = i;
maxLen = max(maxLen, i - start);
}
return maxLen;
}
};
python:
class Solution(object):
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
curr, res, letter = 0, 0, set()
for i, ch in enumerate(s):
while ch in letter:
letter.remove(s[curr])
curr += 1
letter.add(ch)
res = max(res, i - curr + 1)
return res
分享一个极其简单的python写法:
class Solution(object):
def lengthOfLongestSubstring(self, s):
l_substr, l_suffix = '', ''
for each in s:
l_suffix, l_substr = each in l_suffix and l_suffix[l_suffix.index(each) + 1:] + each or l_suffix + each, max((l_suffix, l_substr), key=len)
return len(l_substr)