class Solution {
public:
int lengthOfLongestSubstring(string s) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
map hash;
int res=0;
int index=0,i=0,left=0,right=0;
int zifu[26];
for (int i=0;i<26;i++) {
zifu[i]=-1;
}
i=0;
while (i<s.size())
if (zifu[s[i]-'a']<0) {
zifu[s[i]-'a']=0;
}else {
//index++;
right=i;
if (right-left>res) {
res=right-left;
}
for (int j=0;j<=i;j++) {
zifu[s[j]-'a']=-1;
}
//zifu[s[i]-'a']=0;
left++;
i=left;
zifu[s[i]-'a']=0;
}
i++;
}
if (i-left>res) {
res=i-left;
}
return res;
}
};
14/1/10,brute-force,复杂度O(n^2)
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if (s.size()==0) return 0;
int res=0;
for (int i=0; i<s.size(); i++) {
int *A= new int[26];
for (int k=0; k<26; k++) {
A[k]=0;
}
int cur=0;
for (int j=i; j<s.size(); j++) {
if (A[s[j]-'a']>0) {
break;
}else {
A[s[j]-'a']=1;
cur++;
}
}
if (cur>res) {
res=cur;
}
}
return res;
}
};发现重复后应该从重复字符第一次出现是开始重新计算,而且不需要重新遍历字符,也不需要像第一段代码那样把中间一段重新赋值为零,只要更新字符的位置,同时更新新字符串的左右边界,最后考虑最后一个字串是不是最大字串。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if (s.size()==0) return 0;
int res=0;
int *A= new int[26];
for (int k=0; k<26; k++) {
A[k]=-1;
}
int l=0,r=1;
A[s[0]-'a']=0;
while (r<s.size()) {
if (A[s[r]-'a']>=0) //found
{
if (r-l>res) {
res=r-l;
}
if (A[s[r]-'a']+1>l) {
l=A[s[r]-'a']+1;
}
}
A[s[r]-'a']=r;
r++;
}
if (r-l>res) res=r-l;
return res;
}
};如果把13行改成 if (A[s[r]-'a']>=0),则不需要18行的判断,可以直接赋值,这样更合理。
963

被折叠的 条评论
为什么被折叠?



