92 字符串统计

问题描述 :

明明最近在做一个有关字符串的统计工作。两个由小写字母组成的字符串s1和s2,明明需要统计出以下四种关系: 

(1)在s1或s2中存在的字母(包括在s1和s2中都存在的字母); 

(2)在s1中且在s2中的字母; 

(3)在s1中但不在s2中的字母,在s2中但不在s1中的字母; 

(4)不在s1中且也不在s2中的字母; 

例如两个字符串s1为“lkjsvoahs”,s2为“qglhskjdfg”: 

(1)在s1或者在s2或者s1、s2中都存在的字母:adfghjkloqsv; 

(2)在s1中且在s2中的字母:hjkls; 

(3)在s1中但不在s2中的字母,在s2中但不在s1中的字母:adfgoqv; 

(4)不在s1中且也不在s2中的字母:bceimnprtuwxyz; 

明明统计了很久,但是由于统计过程十分繁琐,且很容易出错,导致明明的进度非常慢,很有可能因为统计不完而错过了晚上的约会。因此明明想请你帮个忙,帮他写一个程序,用程序来统计出以上几项内容。 

明明的问题可以归结为:

输入两串由小写字母组成的字符串s1和s2,比较其中的字母,输出以下四项,输出的字母以字典顺序排列: 

(1)在s1或s2中存在的字母(包括在s1和s2中都存在的字母); 

(2)在s1中且在s2中的字母; 

(3)在s1中但不在s2中的字母,在s2中但不在s1中的字母; 

(4)不在s1中且也不在s2中的字母; 

例如字符串s1为sadf,s2为asdf,则需输出以下四行(注意输出的格式):

in s1 or s2:adfs 

in s1 and s2:adfs 

in s1 but not in s2 ,or in s2 but not in s1: 

not in s1 and s2:bceghijklmnopqrtuvwxyz

 

输入说明 :

你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据两行,每组测试数据的第一行为字符串s1,每组测试数据的第二行为字符串s2;s1和s2都由小写英文字母组成,且长度不超过26个字符。测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。

输出说明 :

对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。

每组运算结果由四行组成: 

第一行为在s1或者在s2或者s1、s2中都存在的字母; 

第二行为在s1中且在s2中的字母; 

第三行为在s1中但不在s2中的字母,在s2中但不在s1中的字母; 

第四行为不在s1中且也不在s2中的字母; 

具体格式请参考样例输出。 

每组运算结果其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间有一个空行,最后一组运算结果后面没有空行。 

注:通常,显示屏为标准输出设备。

输入范例 :

sadf
asdf
lkjsvoahs
qglhskjdfg

输出范例 :

in s1 or s2:adfs
in s1 and s2:adfs
in s1 but not in s2 ,or in s2 but not in s1:
not in s1 and s2:bceghijklmnopqrtuvwxyz

in s1 or s2:adfghjkloqsv
in s1 and s2:hjkls
in s1 but not in s2 ,or in s2 but not in s1:adfgoqv
not in s1 and s2:bceimnprtuwxyz

思想:用两个长度为26的数组,保存各字母在两个字符串的出现情况,然后按照四种情况进行判定。

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

int main()
{
    int i, j, k;
    char s1[100];
    char s2[100];
    int b1[26] = {0};
    int b2[26] = {0};
    int flag =0;
    while (gets(s1) != NULL)
    {
        gets(s2);
        for (i = 0; i < strlen(s1); i++)
        {
            if (b1[s1[i] - 97] == 0)
            {
                b1[s1[i] - 97] = 1;
            }
        }
        for (i = 0; i < strlen(s2); i++)
        {
            if (b2[s2[i] - 97] == 0)
            {
                b2[s2[i] - 97] = 1;
            }
        }
        if(flag){
            printf("\n");
        }
        printf("in s1 or s2:");
        for (i = 0; i < 26; i++)
        {
            if (b1[i] || b2[i])
            {
                printf("%c", i + 97);
            }
        }
        printf("\n");

        printf("in s1 and s2:");
        for (i = 0; i < 26; i++)
        {
            if (b1[i] && b2[i])
            {
                printf("%c", i + 97);
            }
        }
        printf("\n");

        printf("in s1 but not in s2 ,or in s2 but not in s1:");
        for (i = 0; i < 26; i++)
        {
            if (b1[i] && !b2[i])
            {
                printf("%c", i + 97);
            }
            else if (!b1[i] && b2[i])
            {
                printf("%c", i + 97);
            }
        }
        printf("\n");

        printf("not in s1 and s2:");
        for (i = 0; i < 26; i++)
        {
            if (!b1[i] && !b2[i])
            {
                printf("%c", i + 97);
            }
        }
        printf("\n");
        //第二组开始 前面要空一行
        flag++;
        //清空存储数组
        for (i = 0; i < 26; i++)
        {
           b1[i]=0;
           b2[i]=0;
        }
    }
    return 0;
}

 

posted @ 2022-03-10 10:50  梦想是能睡八小时的猪  阅读(50)  评论(0)    收藏  举报