我可以用零填充一个使用过的散列表吗?C编程

ktecyv1j  于 2023-08-03  发布在  其他
关注(0)|答案(2)|浏览(95)

我被要求构建一个函数,该函数在给定字符串中查找没有重复字符的最长子字符串。
这将是一个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;
}

字符串
这段代码将工作,如果我可以用零重新填充使用的散列表,它可能与一个循环,但听起来适得其反,有其他方法吗?这是解决问题的正确方法吗

n3h0vuf2

n3h0vuf21#

要将字符数组hist设置为零,可以使用在头文件<string.h>中声明的标准C函数memset

#include <string.h>

//...

memset( hist, 0, sizeof( hist ) );

字符串
然而,你的代码是不正确的。
如果传递的字符串不是空字符串,则while循环是无限的,因为指针s在循环中没有改变。
类型char可以表现为类型signed char。即字符串可以包含负数代码。在这种情况下,将使用负索引访问数组hist,这将导致未定义的行为。您需要将字符强制转换为类型unsigned char以访问数组的元素。
还要考虑到,如果遇到重复字符,则下一个子串从第一个重复字符的位置旁边的位置开始。为了使其更清楚,请考虑以下字符串

"abcdaefg"


第二次在位置4中找到字符'a'。第一个字符“a”位于位置0。所以下一个子串从位置1开始,它将是最长的子串"bcdaefg"

wecizke3

wecizke32#

我想你可能有点困惑,continue关键字有点没用,因为它会强制下一次迭代,无论如何都会发生的事情。
while保护没有被修改,如果没有break或return,那么如果你进入while块,你基本上是在永远循环。
hashmap可以用memset设置为零,可能你想减去字符'0'而不是'\0',但同时如果你让hashmap变大256,你不需要哈希函数,你可以只使用字符作为索引。

相关问题