/**
* Given a string, find the length of the longest substring without repeating characters.
* For example, the longest substring without repeating letters for "abcabcbb" is "abc",
* which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.
*
*/
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int lengthOfLongestSubstring(string s) {
int str_len = s.size(), i =0, max_len = 0, len = 0, start = 0;
//可见字符最多256个
vector<int> hash(256, -1);
for (; i < str_len; i++)
{
//hash[s[i]] < 0 是新字符
//hash[s[i]] < start 是之前出现过,但已废弃,start是重复字符之后一位的位置
// 例如: abcdb
// 我们遍历到abcd,然后发现b重复,那么后面其实是从c开始,start记录c的位置
// 但是a由于b的影响也就被作废了,但是这个时候a在hash中
// 的下标还是0,但是小于start,所以相当于也是合法的字符
if (hash[s[i]] < 0 || hash[s[i]] < start)
{
len++;
}
else
{
max_len = max_len > len ? max_len : len;
//记录不重复字符的长度,减去重复字符之前的长度
len -= hash[s[i]] - start;
//start是重复字符之后一位的位置
start = hash[s[i]] + 1;
}
hash[s[i]] = i;
}
return max_len > len ? max_len : len;
}
int lengthOfLongestSubstring1(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;
}
int main()
{
//string s("abcdbefgbijklmnopqb");//13
string s("abcdbefgb"); //6
cout << lengthOfLongestSubstring(s) << endl;
system("pause");
return 0;
}
【leetcode】3. Longest Substring Without Repeating Characters
最新推荐文章于 2021-12-03 15:58:56 发布