3无重复字符的最长子串
思路一 滑动窗口
1.左边界和右边界从字符串的首地址开始
2.右边界向右扩大,每扩大一位遍历窗口内的字符。不重复则更新长度。
3.当发现要纳入窗口中的字符(*right)与窗口内字符重复,则将左窗口移动至窗口内与之重复字符的下一位,剔除掉重复字符。
4.重复之前步骤。
tips:相同类型的指针做加减,以步长为基本单位
int lengthOfLongestSubstring(char * s){
//if(*s==0) return 0;
//if(*s==' ') return 1;
char*head=s;
char*cur=s;
int max=0;
while(*cur)
{
for(char*p=head;p<cur;p++)//用指针来遍历窗口内的字母,每次从left开始
{
if(*p==*cur)
{
head=p+1;
break;//找到重复字符,重新规划窗口
}
}
max=(cur-head+1)>max?(cur-head+1):max;
++cur;
}
return max;
}
思路二 哈希加滑动窗口
定义一个数组arr,大小为z的ascii值加1,这样便可以容纳所有字母。
与上面一样的思路,不过思路一是用指针遍历窗口来判断是否有重复。哈希则是用映射来判断。利用字母的ascII值来映射,比如a,出现一次则将arr[a]加一,出现两次则代表重复,需要剔除!
int lengthOfLongestSubstring(char * s){
int len=strlen(s);
if(len<1) return len;
int left,right,max=0;
int arr[128]={0};
for(left=0,right=0;right<len;right++)
{
arr[s[right]]++;//字母出现一次就+1,也就是窗口内字母数量加1
while(arr[s[right]]>1)//当出现两次以上,则剔除
{
arr[s[left]]--;//左窗口缩小前,使左窗口字母出现的次数-1
left++;//左窗口缩小
}
max=fmax(max,right-left+1);
}
return max;
}