- 给定一个字符串,找出没有重复字符的最长子字符串的长度。
例如,“abcabcbb”没有重复字母的最长子串是“abc”,
其中长度为3。对于“bbbbb”,最长的子串是“b”,长度为1。
主意:
使用map存储每个字符的索引。因此,我们可以很容易地知道 when 重复和之前重复的 char 的索引。然后我们可以取出之前重复的字符,并继续跟踪最大长度。
#include <string.h>
#include <iostream>
#include <string>
#include <map>
using namespace std;
int lengthOfLongestSubString1(string s)
{
map<char,int>m;
int maxLen = 0;
int lastRepeatPos = -1;
for(int i = 0;i<s.size();i++)
{
if(m.find(s[i])!=m.end() && lastRepeatPos < m[s[i]]){
lastRepeatPos = m[s[i]];
}
if(i - lastRepeatPos > maxLen)
{
maxLen = i - lastRepeatPos;
}
m[s[i]] = i;
}
return maxLen;
}
don't use <map>
int lengthOfLongestSubstring(string s)
{
const int MAX_CHARS = 256;
int m[MAX_CHARS];
memset(m,-1,sizeof(m));
int maxLen = 0;
int lastRepeatPos = 0;
for(int i = 0;i<s.size();i++)
{
if(m[s[i]]!=-1 && lastRepeatPos < m[s[i]])
{
lastRepeatPos = m[s[i]];
}
if(i - lastRepeatPos > maxLen)
{
maxLen = i - lastRepeatPos;
}
m[s[i]] = i;
}
return maxLen;
}
int main(int argc, char **argv)
{
string s = "abcabcbb";
cout << s << " : " << lengthOfLongestSubstring(s) << endl;
s = "bbbbb";
cout << s << " : " << lengthOfLongestSubstring(s) << endl;
s = "bbabcdb";
cout << s << " : " << lengthOfLongestSubstring(s) << endl;
if (argc > 1)
{
s = argv[1];
cout << s << " : " << lengthOfLongestSubstring(s) << endl;
}
return 0;
}