1. 程式人生 > 其它 >92 字串統計

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