/**
* 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.