两个字符串中没有重复的类似字符的计数

问题描述 投票:3回答:3

我编写了一个C程序来查找两个字符串之间相似字符的数量。如果再次重复一个角色,则不应计算它。

就像你输入一样

everest
every

输出应该是

3

因为四个字母“永远”是相同的,但重复的“e”不会增加计数。

输入

apothecary
panther

输出应该是6,因为“apther”,不计算第二个“a”。

对于一个简短的过程,我的代码似乎是一个重要的代码我的代码是

#include<stdio.h>
#include <stdlib.h>

int main()
{
   char firstString[100], secondString[100], similarChar[100], uniqueChar[100] = {0};
   fgets(firstString, 100, stdin);
   fgets(secondString, 100, stdin);
   int firstStringLength = strlen(firstString) - 1, secondStringLength = strlen(secondString) - 1, counter, counter1, count = 0, uniqueElem, uniqueCtr = 0;
   for(counter = 0; counter < firstStringLength; counter++) {
       for(counter1 = 0; counter1 < secondStringLength; counter1++) {
           if(firstString[counter] == secondString[counter1]){
               similarChar[count] = firstString[counter];
               count++;
               break;
           }
       }
   }
   for(counter = 0; counter < strlen(similarChar); counter++) {
       uniqueElem = 0;
       for(counter1 = 0; counter1 < counter; counter1++) {
          if(similarChar[counter] == uniqueChar[counter1]) {
              uniqueElem++;
          }
       }
       if(uniqueElem == 0) {
           uniqueChar[uniqueCtr++] = similarChar[counter];
       }
       }
   if(strlen(uniqueChar) > 1) {
    printf("%d\n", strlen(uniqueChar));
    printf("%s", uniqueChar);
   } else {
   printf("%d",0);
   }
}

有人可以提供一些建议或代码来缩短这个功能吗?

c string
3个回答
2
投票

你应该有2个数组来计算每个aplhabet的出现次数。

int arrayCount1[26],arrayCount2[26];

循环遍历字符串并存储事件。

现在计算相似数量的字符使用:

for( int i = 0 ; i < 26 ; i++ ){
   similarCharacters = similarCharacters + min( arrayCount1[26], arrayCount2[26] )
}

2
投票

有一个简单的方法去。获取一个数组并将ascii代码映射为该数组的索引。说int arr[256]={0};

现在,无论你在字符串-1中看到什么字符都标记为1arr[string[i]]=1;标记第一个字符串中出现的字符。

现在再次循环遍历字符串-2的字符时,仅当arr[string2[i]]++arr[i]时才会增加1的值。现在我们正在计算是的,这个角色也出现在这里。

现在检查数组中包含2的位置数。这就是答案。

int arr[256]={0};
for(counter = 0; counter < firstStringLength; counter++) 
    arr[firstString[counter]]=1;
for(counter = 0; counter < secondStringLength; counter++) 
    if(arr[secondString[counter]]==1)
      arr[secondString[counter]]++;

int ans = 0;
for(int i = 0; i < 256; i++)
  ans += (arr[i]==2);

1
投票

这是实现目标的简化方法。您应该创建一个数组来保存第一次看到的字符。

然后,你将不得不做两个循环。第一个是无条件的,而第二个是有条件的;该条件取决于您必须创建的变量,该变量检查天气是否已到达其中一个字符串的末尾。

当然,他们检查另一个字符串的结尾应该在第一个无条件循环内。您可以使用strchr()函数来计算常见字符而不重复:

#include <stdio.h>
#include <string.h>

int foo(const char *s1, const char *s2);

int main(void)
{
    printf("count: %d\n", foo("everest", "every"));
    printf("count: %d\n", foo("apothecary", "panther"));
    printf("count: %d\n", foo("abacus", "abracadabra"));
    return 0;
}


int foo(const char *s1, const char *s2)
{
    int condition = 0;
    int count = 0;

    size_t n = 0;
    char buf[256] = { 0 };

    // part 1
    while (s2[n])
    {
        if (strchr(s1, s2[n]) && !strchr(buf, s2[n]))
        {
            buf[count++] = s2[n];
        }
        if (!s1[n]) {
            condition = 1;
        }
        n++;
    }
    // part 2
    if (!condition ) {
        while (s1[n]) {
            if (strchr(s2, s1[n]) && !strchr(buf, s1[n]))
            {
                buf[count++] = s1[n];
            }
            n++;
        }
    }

    return count;
}

注意:您应检查缓冲区溢出,并应使用动态方法相应地重新分配内存,但这是一个演示。

© www.soinside.com 2019 - 2024. All rights reserved.