C 两个字符串中相似字符的计数,不重复

C 两个字符串中相似字符的计数,不重复,c,string,C,String,我已经写了一个C程序来找出两个字符串之间相似字符的数目。如果某个字符再次重复,则不应将其计数 比如说,如果你输入 everest every 输出应该是 3 因为四个字母“ever”是相同的,但重复的“e”不会增加计数 输入 apothecary panther 输出应为6,因为“apther”,不计算第二个“a” 我的代码看起来像是一个短流程的批量代码。我的代码是 #include<stdio.h> #include <stdlib.h> int main()

我已经写了一个C程序来找出两个字符串之间相似字符的数目。如果某个字符再次重复,则不应将其计数

比如说,如果你输入

everest
every
输出应该是

3
因为四个字母“ever”是相同的,但重复的“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);
   }
}
#包括
#包括
int main()
{
字符firstString[100],secondString[100],similarChar[100],uniqueChar[100]={0};
fgets(第一串,100,标准输入);
fgets(第二串,100,标准输入);
int firstStringLength=strlen(firstString)-1,secondStringLength=strlen(secondString)-1,计数器,计数器1,计数=0,uniquelem,uniqueCtr=0;
用于(计数器=0;计数器1){
printf(“%d\n”,strlen(uniqueChar));
printf(“%s”,uniqueChar);
}否则{
printf(“%d”,0);
}
}

有人能为我提供一些缩短此函数的建议或代码吗?

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

现在,不管您在string-1中看到什么字符,请为此标记
1
<代码>arr[string[i]=1;标记第一个字符串中出现的字符

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

现在检查数组中有多少个位置包含
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);
int-arr[256]={0};
用于(计数器=0;计数器
您应该有2个数组来记录每个aplhabet的出现次数

int arrayCount1[26],arrayCount2[26];
循环遍历字符串并存储引用

现在,要计算相似的字符数,请使用:

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

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

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

当然,检查另一个字符串的结尾应该在第一个无条件循环中。您可以使用
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;
}
#包括
#包括
int foo(常量字符*s1,常量字符*s2);
内部主(空)
{
printf(“计数:%d\n”,foo(“珠穆朗玛峰”,“每个”);
printf(“计数:%d\n”,foo(“药剂师”、“黑豹”);
printf(“计数:%d\n”,foo(“算盘”,“abracadabra”);
返回0;
}
int foo(常量字符*s1,常量字符*s2)
{
int条件=0;
整数计数=0;
尺寸n=0;
char buf[256]={0};
//第一部分
while(s2[n])
{
if(strchr(s1,s2[n])&&!strchr(buf,s2[n]))
{
buf[count++]=s2[n];
}
如果(!s1[n]){
条件=1;
}
n++;
}
//第二部分
如果(!条件){
while(s1[n]){
if(strchr(s2,s1[n])&&!strchr(buf,s1[n]))
{
buf[count++]=s1[n];
}
n++;
}
}
返回计数;
}

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

在示例输入中,您只有一个输入字符串。为什么输出为3?我数了4个相似/相同的字符。那么,如果输入的是“药剂师”和“黑豹”,那么计数会是6吗?“算盘”和“abracadabra”-3怎么样?是的,现在是4,但e又在重复。所以它应该把计数设为3。如果一个字符再次重复,则不应计数it@JonathanLeffler是的,计数是6,下一次是3是的!你能帮我查一下密码吗?我不明白最后一点。@RameshSekhar.:编辑。你现在就知道了。@RameshSekhar.:你选择的答案是假设。这更一般化了。当你选择答案时要小心。你能把我的全部代码都加在后面吗?这有点让人困惑:(什么让人困惑?你在假设哪个字符应该计数,只有26个。另一个答案更可靠,并且更进一步优化计数。根据问题中的样本输入,我唯一的假设是他只需要计算两个字符串之间的相似字母。问题没有“字符”“字母”,而不是“字母”,也不是“小写字母”。我数了至少两个,也许三个,y的假设