Longest Substring Without Repeating Characters
(原题链接:
点击打开链接)
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.
Solution:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int total = 0;
int maxtotal = 0;
string subs = "";
int hasrepeat = 0;
for(int a = 0; a < s.length(); a++)
{
hasrepeat = 0;
for(int b = 0; b < subs.length(); b++)
{
if(s[a] == subs[b])
{
maxtotal = (total > maxtotal) ? total : maxtotal;
subs = subs.substr(b+1, subs.length() - b -1) + s[a];
total = subs.length();
hasrepeat = 1;
break;
}
}
if (! hasrepeat)
{
subs += s[a];
total++;
}
}
maxtotal = (total > maxtotal) ? total : maxtotal;
return maxtotal;
}
};
上面做法在判断是否有重复的时候进行循环,很耗时。尝试用数组来存储,就能把时间复杂度降为O(N)
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int total = 0;
int start = 0;
int maxtotal = 0;
int characters[256];
int hasrepeat = 0;
if (s.length() == 0) return 0;
for (int a = 0; a < 256; a++) characters[a] = -1;
for (int a = 0; a < s.length(); a++)
{
if (characters[s[a]] >= start)
{
int oldchar = characters[s[a]];
characters[s[a]] = a;
total = a - start ;
start = oldchar + 1;;
hasrepeat = 1;
maxtotal = (total > maxtotal) ? total : maxtotal;
}
else
{
characters[s[a]] = a;
}
}
total = s.length() - start;
maxtotal = (total > maxtotal) ? total : maxtotal;
return maxtotal;
}
};