Problem: 3. 无重复字符的最长子串
1、思路
见到这种题,一般都会想到用双指针标记,而后令一个指针向后走,每走一次让前一个指针遍历一遍走过的路径看一看是否存在相似的量,但这样有些麻烦且大费篇章,使用类哈希表的方法可以更加简便的进行功能实现。
2、解题方法
ASSIC码值我们都知道,本题明确标注了是字符串,所以我们可以用127位的数组来进行标记,同样也是双下标的方法,第一个下标不动处于起始位置,第二个下标向后延申,当遇到重复时,让第一个下标转移到第二个下标的位置,并记录下此时的下标差值,即为不重复的长度。
3、复杂度
时间复杂度:
添加时间复杂度, 示例: O ( n ) O(n) O(n)
空间复杂度:
添加空间复杂度, 示例: O ( 1 ) O(1) O(1)
4、Code
int lengthOfLongestSubstring(char* s)
{
int hash[127] = {0}; //依据ASSIC创建127个空间的数组
int left = 0; //定义左下标变量
int right = 0; //定义右下标变量,并让其和左下标处在同一起始位置
int max = 0; //记录最大的不重复字符串长度。
while(s[right]) //通过循环遍历输入的字符串
{
if(hash[s[right]] && left < hash[s[right]]) //判断是否有重复
{
left = hash[s[right]]; //进入条件语句即代表有重复,此时将left表示位置
//移动至right的位置并重新开始寻找下一个重复
}
hash[s[right]] = right + 1; //让类哈希数组中s[right]所代表的ASSIC码值的下标
//位置存储字符所在输入字符串中的位置(right + 1
//是为了避免记录时造成冲突,因为类哈希表中的原
//数据为0)。
max = max < (right - left + 1) ? (right - left + 1) : max;
//通过对比左右下表变量的差值来确定最大不重复长度
right++;
}
return max;//循环完毕直接返回max即可
}
5、结语
十分感谢您观看我的原创文章。
本文主要用于个人学习和知识分享,学习路漫漫,如有错误,感谢指正。
如需引用,注明地址。