在 C 中查找字符串数组中的唯一元素
C 对字符串的处理让我烦恼。我脑子里有这样的伪代码:
char *data[20];
char *tmp; int i,j;
for(i=0;i<20;i++) {
tmp = data[i];
for(j=1;j<20;j++)
{
if(strcmp(tmp,data[j]))
//then except the uniqueness, store them in elsewhere
}
}
但是当我编码时结果很糟糕。(我处理了所有内存的东西,小东西等)问题显然是在第二个循环中:D。但我想不出任何解决办法。如何在数组中找到唯一的字符串。
输入示例:输入 abc def abe abc def deg 独特的:应该找到 abc def abe deg 。
C bothers me with its handling of strings. I have a pseudocode like this in my mind:
char *data[20];
char *tmp; int i,j;
for(i=0;i<20;i++) {
tmp = data[i];
for(j=1;j<20;j++)
{
if(strcmp(tmp,data[j]))
//then except the uniqueness, store them in elsewhere
}
}
But when i coded this the results were bad.(I handled all the memory stuff,little things etc.) The problem is in the second loop obviously :D. But i cannot think any solution. How do i find unique strings in an array.
Example input : abc def abe abc def deg entered
unique ones : abc def abe deg should be found.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
您可以使用 qsort 强制重复项彼此相邻。排序后,您只需比较相邻条目即可查找重复项。结果是 O(N log N) 而不是(我认为)O(N^2)。
这是 15 分钟的午餐版本,没有错误检查:
You could use qsort to force the duplicates next to each other. Once sorted, you only need to compare adjacent entries to find duplicates. The result is O(N log N) rather than (I think) O(N^2).
Here is the 15 minute lunchtime version with no error checking:
如果我做得正确的话,每个唯一字符串第一次出现的索引应该在 unique[0..n-1] 中。
The indexes of the first occurrence of each unique string should be in unique[0..n-1] if I did that right.
为什么要从 1 开始第二个循环?
你应该从
我+1。即
,如果列表是
then
当 i==4
tmp="lop"
但随后第二个循环开始,从 1 到 19。这意味着它在一个阶段也会得到值 4,然后是
data[4] ,即“lop”,将与 tmp 相同。因此,虽然“lop”是唯一的,但它会被标记为重复。
希望有帮助。
Why are you starting second loop from 1?
You should start it from
i+1. i.e.
Like if the list is
then
when i==4
tmp="lop"
but then the second loop starts which is from 1 to 19. This means it will get a value of 4 too at one stage, and then
data[4], which is "lop", will be same as tmp. So although "lop" is unique but it will be flagged as repeated.
Hope it was helpful.
多思考一下您的问题 - 您真正想做的是查看 PREVIOUS 字符串,看看您是否已经见过它。因此,对于每个字符串
n
,将其与字符串0
到n-1
进行比较。Think a bit more about your problem -- what you really want to do is look at the PREVIOUS strings to see if you've already seen it. So, for each string
n
, compare it to strings0
throughn-1
.您的测试是否可能是 if (strcmp (this, that)) 如果两者不同,它会成功? !strcmp 可能就是您想要的。
Might it be that your test is if (strcmp (this, that)) which will succeed if the two are different? !strcmp is probably what you want there.