同样是双指针法,一个指针使得字符串变长,一个使得字符串变短。分析问题可知我们可以让两个指针都从字符串开头开始,然后都向右移动。满足条件,就移动右指针使得字符串变长看看是否还满足条件,一旦条件不满足,就移动左指针使得字符串变短,满足条件。
求解这道题,还利用了字符字典。但是这里的字典由于键只有固定的26个英文字母,可以使用简化的散列表(就是一个数组)来进行查询,在常数时间内判断出字符串内是否存在这个字母。
还有一个很重要的问题,java等高级语言定义变量的时候会自动初始化分配到的内存空间,而C++不会,每个变量必须在定义的时候初始化,也就是赋值,不然就会是内存中原来的值。如果不进行人工初始化,就会出现执行成功,但是提交失败的情况。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.size()==0)return 0;
int right=1;
int left=0;
int len=1;
int res=1;
int exist[128];
for(int i=0;i<128;i++)exist[i]=0;
exist[s[left]]=1;
while(right<s.size()){
if(exist[s[right]]==1){
while(exist[s[right]]==1){
exist[s[left]]=0;
left++;
len--;
}
}
exist[s[right]]=1;
right++;
len++;
if(len>res)res=len;
}
//len++;if(len>res)res=len;
return res;
}
};
又是一个完美的分数。