首页 > 解决方案 > 如何计算两个字符串之间共有的不同字符的数量?

问题描述

程序如何计算两个字符串之间共有的不同字符的数量?

例如,如果s1="connect"s2="rectangle",计数显示为 5,但正确答案为 4;重复字符只能计算一次。如何修改此代码以使计数正确?

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

int main()
{
    int i,j,count=0;
    char s1[100],s2[100];
    scanf("%s",s1);//string 1 is inputted
    scanf("%s",s2);//string 2 is taken as input
    for(i=1;i<strlen(s1);i++)
    {
        for(j=1;j<strlen(s2);j++)
        {
            if(s1[i]==s2[j])//compare each char of both the strings to find common  letters
            {
                count++;//count the common  letters
                break;
            }
        }

    }
    printf("%d",count);//display the count

}

该程序将两个字符串作为输入,并显示这些字符串中常见字符的计数。请让我知道这段代码有什么问题。

标签: c

解决方案


如果必须忽略重复字符,程序必须“记住”已经遇到的字符。您可以通过将已处理的字符存储到字符数组中来做到这一点,然后在处理其他字符时查阅该数组。

您可以使用计数器变量来跟踪常见字符的数量,例如

int ctr=0;
char s1[100]="connect", s2[100]="rectangle", t[100]="";

这里,t是将存储检查的字符的字符数组。它的大小与其他 2 个字符数组中最大的一个的大小相同。

现在使用像这样的循环

for(int i=0; s1[i]; ++i)
{
    if(strchr(t, s1[i])==NULL && strchr(s2, s1[i])!=NULL)
    {
        t[ctr++]=s1[i];
        t[ctr]=0;
    }
}

t最初有一个空字符串。以前不存在的字符通过循环体添加到它,只有当正在检查的字符(即, )不在另一个字符串中但存在于另一个字符串(即, )t时,才会执行该循环体。s1[i]ts2

strchr()是一个带有原型的函数

char *strchr( const char *str, int c );

strchr()在 指向的字符串中查找 c 的第一次出现strNULL如果c中不存在则返回str


您的使用scanf()可能会引起麻烦。

利用

scanf("%99s",s1);

(其中 99 比数组的大小小一s1)而不是

scanf("%s",s1);

以防止溢出问题。并检查返回值scanf()是否为1. scanf()返回它所做的成功分配的数量。

或用于fgets()读取字符串。

阅读这篇文章以了解更多信息。

请注意,数组索引从0. 因此,在您的循环中,不会检查字符串的第一个字符。

所以应该是这样的

for(i=0;i<strlen(s1);i++)

代替

for(i=1;i<strlen(s1);i++)

推荐阅读