目录
问题:
给定一个字符串
s
,请你找出其中不含有重复字符的 最长子串 的长度。
(我们先看看ac代码)
代码
int left = 0; //左窗口
int right = 0; //右窗口
int i,j;
int len = strlen(s); //计算字符串长度,便于之后判断是否结束遍历
int max = 0; //存放最长的无重复字符的子字符串的长度
//用于判断一串字符串是否出现重复字符
int havesamechar=0;
// 让左右窗口进行滑动,直到字符串结束
for( i = 0 ; i < len ; i++ ){
havesamechar = 0;
for( j=left ; j<right ; j++ ){
//判断是否出现相同字符
if( s[j] == s[right] ){
//在这里我们顺便就记下了重复字符的位置j
havesamechar = 1;
break;
}
}
//判断是否出现相同字符
if(havesamechar){
//当出现相同字符,让左窗口向右移动到出现重复字符的下一个字符
left = j + 1;
}
//每次都得计算一下是否是最长无重复字符的子字符串
max = max < ( right - left + 1 ) ? ( right - left + 1 ) : max;
right++;
}
return max;
//题解来自于leetcode上名为我自横刀向天笑,id为goodgoodday。
(题解来自于leetcode上名为我自横刀向天笑,id为goodgoodday)
这段代码用到的解题思想是滑动窗口算法。
思路
用两个变量分别来不断地在字符串上滑动,也是就是不断指向字符串。本段代码左窗口是left和右窗口是right
先让右窗口进行滑动,每滑动一次,就得让左窗口以及他们之间的所有字符跟右窗口进行判断,检查是否有相同的字符。若是发现有相同字符,我们就让左窗口直接跳转到和右窗口相同字符的下一个字符,然后继续让右窗口滑动。
最后(笔者的絮絮叨叨)
这题写了我半天,最开始看到这题时我就有思路了。我的想法:因为每一个字符都有自己唯一的十进制的ASCII码,且恰好这是一个字符串,可以让一个长度为a[127]的数组在对应的位置记录子字符串的情况。我们遍历数组,每走一步,我们就判断是否有重复字符,但是我发现这样的话,在判断出有重复字符时,我无法找出前面对应的重复字符的位置。也就无法让循环跳转到那个位置继续子串的判断。:(