两个字符串

时间:2018-02-10 06:51:09

标签: c string

我编写了一个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);
   }
}

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

3 个答案:

答案 0 :(得分: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 :(得分:2)

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

0, 1

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

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

int arrayCount1[26],arrayCount2[26];

答案 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;
}

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