我被要求构建一个函数,该函数在给定字符串中查找没有重复字符的最长子字符串。
这将是一个2合1的问题BC我想现在如果我的方法是正确的,如果“清空”一个散列表是可能的。我使用了这段代码:
int lengthOfLongestSubstring(char * s){
int hist[256] = {0};
int count = 0;
int max_count = 0;
while(*s){
hist[*s - '\0']++;
if (hist[*s - '\0'] > 1 ){
//fill hist with zeros to start counting again
max_count = count - 1;
count = 0;
continue;
}
}
return max_count;
}
字符串
这段代码将工作,如果我可以用零重新填充使用的散列表,它可能与一个循环,但听起来适得其反,有其他方法吗?这是解决问题的正确方法吗
2条答案
按热度按时间n3h0vuf21#
要将字符数组
hist
设置为零,可以使用在头文件<string.h>
中声明的标准C函数memset
字符串
然而,你的代码是不正确的。
如果传递的字符串不是空字符串,则while循环是无限的,因为指针
s
在循环中没有改变。类型
char
可以表现为类型signed char
。即字符串可以包含负数代码。在这种情况下,将使用负索引访问数组hist
,这将导致未定义的行为。您需要将字符强制转换为类型unsigned char
以访问数组的元素。还要考虑到,如果遇到重复字符,则下一个子串从第一个重复字符的位置旁边的位置开始。为了使其更清楚,请考虑以下字符串
型
第二次在位置
4
中找到字符'a'。第一个字符“a”位于位置0
。所以下一个子串从位置1
开始,它将是最长的子串"bcdaefg"
。wecizke32#
我想你可能有点困惑,continue关键字有点没用,因为它会强制下一次迭代,无论如何都会发生的事情。
while保护没有被修改,如果没有break或return,那么如果你进入while块,你基本上是在永远循环。
hashmap可以用memset设置为零,可能你想减去字符'0'而不是'\0',但同时如果你让hashmap变大256,你不需要哈希函数,你可以只使用字符作为索引。