题目链接
Given a string, find the length of the longest substring without repeating characters.
Examples:
Given “abcabcbb”, the answer is “abc”, which the length is 3.
Given “bbbbb”, the answer is “b”, with the length of 1.
Given “pwwkew”, the answer is “wke”, with the length of 3. Note that the answer must be a substring, “pwke” is a subsequence and not a substring.
方法一:
直接暴力,这样的效率有点低,要重复很多不必要的情况,最坏要遍历O(n*(n+1)/2)即O(n)的复杂度
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int len = s.length();
if(len==0) return 0;
vector<int>V;
map<char,int>M;
int Max=1 ,j=-1 ;
for(int i=0;i<len;i++)
{
if(M[s[i]]==0)
{
V.push_back(s[i]); if(V.size()==1) j=i;
M[s[i]]=1;
}
else
{
if(V.size()>Max) Max=V.size();
M.clear();
V.clear();
i=j;
}
}
if(V.size()>Max) Max=V.size();
return Max;
}
};
方法二:
用STL map 也就是HASH 可以把复杂度降到 O(n) key为字符串中的字符 , Value 为对应key的值。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int MAXlen =1;
int repeatIndex=0;
int len =s.size();
if(len==0) return 0;
unordered_map<char,int> M;
for(int i=0;i<len;i++)
{
if(M.find(s[i])!=M.end()&&M[s[i]]>repeatIndex)
{
repeatIndex=M[s[i]];
}
if(MAXlen<i+1-repeatIndex)
{
MAXlen = i+1-repeatIndex;
}
M[s[i]]=i+1;
}
return MAXlen;
}
};