这道题需要判断子串的长度那就一定得找到子串的头和子串的尾,然后尾和头的差值就是长度,那就需要一个头指针一个尾指针,尾指针遍历数组每个字符的同时去查询头指针到尾指针这里是否有重复的字符,咋一看跟第1题有点像。
第1题通过每次将遍历的字符塞进哈希表来达到只遍历一次的效果,那这里也能用类似的办法,遍历的同时将字符塞进哈希表,这里比第一题方便的原因是这里是字符串,那字符串只有0~128种可能,那声明一个128个元素的数组就行了,代码如下:
int lengthOfLongestSubstring(char *s)
{
int head = 0;
int tail = 0;
int max_len = 0;
char hash_map[128] = {0};
while (s[tail])
{
// 表里是否存在重复元素
if (hash_map[s[tail]])
{
if (tail - head > max_len)
{
max_len = tail - head;
}
while (head < tail)
{
if (s[head] == s[tail])
{
head++;
break;
}
hash_map[s[head]] = 0;
head++;
}
}
hash_map[s[tail]] = 1;
tail++;
}
if (tail - head > max_len)
{
max_len = tail - head;
}
return max_len;
}
在leetcode上自己做题然后看看别人的想法确实偶尔有收获。
leetcode上面的解决方法有的实在没法理解的话不强求,适合自己但是又能比普通解法好一点的才是最好的(个人理解)。