题目:
想法:
用hash表存储,可以使查询时间降到
O(1)
,两次循环遍历,实践复杂度为
O(n2)
。
代码如下:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int i, j;
int zm[256];
int len1 = s.length();
int len2;
int lengthmost, lengtheach;
lengthmost = 0;
for (i = 0; i < len1; i++) {
if (len1 - i < lengthmost)
break;
lengtheach = 0;
memset(zm, 0, 256*sizeof(int));
for (j = i; j < len1; j++) {
if (zm[s[j] ]> 0) {
break;
}
else {
zm[s[j]]++;
}
}
lengtheach = j - i ;
if (lengtheach > lengthmost) {
lengthmost = lengtheach;
}
}
return lengthmost;
}
};
实际上有
O(n)
的算法,该博客上给出了详细的解释
http://blog.csdn.net/feliciafay/article/details/16895637
核心思想是i,j最多都只遍历一次string。
代码如下:
int lengthOfLongestSubstring(string s) {
int n = s.length();
int i = 0, j = 0;
int maxLen = 0;
bool exist[256] = { false };
while (j < n) {
if (exist[s[j]]) {
maxLen = max(maxLen, j-i);
while (s[i] != s[j]) {
exist[s[i]] = false;
i++;
}
i++;
j++;
} else {
exist[s[j]] = true;
j++;
}
}
maxLen = max(maxLen, n-i);
return maxLen;
}