C 这段代码如何在字符串中找到重复字符?
示例:给定一个字符串(在本例中为C 这段代码如何在字符串中找到重复字符?,c,duplicates,C,Duplicates,示例:给定一个字符串(在本例中为char*word),您希望查找重复的字符(字节) 我想知道是否有人能向我解释一下以下的工作原理: int表[256]={0}; 对于(inti=0;i
char*word
),您希望查找重复的字符(字节)
我想知道是否有人能向我解释一下以下的工作原理:
int表[256]={0};
对于(inti=0;i
之后,如果重复或不相似,您可以使用另一个循环进行检查:
for(inti=0;i1){…}
这是怎么回事?我不明白为什么重复字符在表中大于1?将我的评论转换成半连贯的答案
第一个循环统计0..255范围内每个字节值的出现次数(它为找到的每个字节值的字节计数加一);重新扫描将查找字符串中出现多次的字节值,即重复的定义 例如,循环都假定字符串编码在单字节代码集中,而不是像UTF-8那样的多字节代码集中。他们还假设普通
char
是无符号类型(不常见;大多数x86平台都有有符号的普通char
类型),或者字符串中没有word[i]
为负数的值(没有重音字符)
因此,为了安全起见,规范应为:
for (int i = 0; i < len; i++)
table[(unsigned char)word[i]]++;
for (int i = 0; i < len; i++)
{
if (table[(unsigned char)word[i]] > 1)
{
…
}
}
for(int i=0;i1)
{
…
}
}
您可以使用word[i]&0xFF
代替cast;它甚至有更少的角色,但我认为演员阵容更清晰(而且角色数量是一条红鲱鱼——请不要追逐它)。请注意,无论纯char
是有符号类型还是无符号类型,这两种变体(cast和mask)都能正常工作(尽管代码确实做出了最合理的假设,即char\u BIT
是8,而不是更大的数字-不能更小)
但是为什么它会添加到它找到的每个char值,而不仅仅是表中当前位置上的char值呢?当我打印出内存位置时,我从一个示例字符串“abcda”
中看到,两个a在内存中是相同的。我认为在表数组中,它们必须是不同的(但连续的)位置;为什么是一样的
当您在字符串中找到'a'
时,有一个字节值,通常是97,与该字符关联。因此,当计数代码读取word[i]
并且word[i]
的内容是'a'
,就好像数组中有97个(事实上,数组中有97个),所以第一个循环递增表[97]
-当读取abcda
中的第一个a
时,将其从0更改为1,当读取第二个a
时,从1到2
当所有的说和做都完成时,角色只是数字(但在所有的说和做之前,有很多的说和做可以发生;幸运的是,你大部分时间不必经历所有这些) 将我的评论转换成半连贯的答案
第一个循环统计0..255范围内每个字节值的出现次数(它为找到的每个字节值的字节计数加一);重新扫描将查找字符串中出现多次的字节值,即重复的定义 例如,循环都假定字符串编码在单字节代码集中,而不是像UTF-8那样的多字节代码集中。他们还假设普通
char
是无符号类型(不常见;大多数x86平台都有有符号的普通char
类型),或者字符串中没有word[i]
为负数的值(没有重音字符)
因此,为了安全起见,规范应为:
for (int i = 0; i < len; i++)
table[(unsigned char)word[i]]++;
for (int i = 0; i < len; i++)
{
if (table[(unsigned char)word[i]] > 1)
{
…
}
}
for(int i=0;i1)
{
…
}
}
您可以使用word[i]&0xFF
代替cast;它甚至有更少的角色,但我认为演员阵容更清晰(而且角色数量是一条红鲱鱼——请不要追逐它)。请注意,无论纯char
是有符号类型还是无符号类型,这两种变体(cast和mask)都能正常工作(尽管代码确实做出了最合理的假设,即char\u BIT
是8,而不是更大的数字-不能更小)
但是为什么它会添加到它找到的每个char值,而不仅仅是表中当前位置上的char值呢?当我打印出内存位置时,我从一个示例字符串“abcda”
中看到,两个a在内存中是相同的。我认为在表数组中,它们必须是不同的(但连续的)位置;为什么是一样的
当您在字符串中找到'a'
时,有一个字节值,通常是97,与该字符关联。因此,当计数代码读取word[i]
并且word[i]
的内容是'a'
,就好像数组中有97个(事实上,数组中有97个),所以第一个循环递增表[97]
-当读取abcda
中的第一个a
时,将其从0更改为1,当读取第二个a
时,从1到2
当所有的说和做都完成时,角色只是数字(但在所有的说和做之前,有很多的说和做可以发生;幸运的是,你大部分时间不必经历所有这些) 函数移除副本(str){
让结果=”;
设freq={};
for(设i=0;i