66 字符串统计
作者: SunCiHai时间限制: 10S章节: 字符串
问题描述 :
明明最近在做一个有关字符串的统计工作。两个由小写字母组成的字符串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
解决方案:
采用四个函数解决四个问题,按部就班写即可,注意细节问题
#include <stdio.h>
#include <string.h>
char number1[26];
char number2[26];
char number3[26];
char number4[26];
void sort(char s[],int len){//排序加上剔除重复的
int i, j;
for (i = 0; i < len;i++)
for (j = 0; j < len - i - 1; j++){
if (s[j]>s[j + 1]){
char temp = s[j];
s[j] = s[j + 1];
s[j + 1] = temp;
}
}
char *p = s;
i = 0;
while (*p != '\0'){
if (*p != *(p + 1))
s[i++] = *p;
p++;
}
s[i] = '\0';//字符串结束标志
}
void function1(char s1[],int len1,char s2[],int len2){//求并集
int index;
for (index = 0; index < len1; index++){//手写strcpy函数
number1[index] = s1[index];
}
int i,j;
for (j = 0; j < len2; j++)
{
for (i = 0; i < index; i++)
{
if (number1[i] == s2[j])
break;
}
if (i==index)
number1[index++] = s2[j];
}
sort(number1, index);
}
void function2(char s1[], int len1, char s2[], int len2){//求交集
int index=0;
int i, j;
for (i = 0; i < len1; i++){
for (j = 0; j < len2; j++){
if (s1[i] == s2[j])
number2[index++] = s1[i];
}
}
if (index == 0) number2[0] = '\0';
sort(number2, index);
}
void function3(char s1[], int len1, char s2[], int len2){//在s1不在s2 在s2不在s1
int index = 0;
int i, j;
for (i = 0; i < len1; i++){//在s1中
for (j = 0; j < len2; j++){
if (s1[i] == s2[j])
break;
}
if (j==len2)
number3[index++] = s1[i];
}
for (j = 0; j < len2;j++){//在s2中
for (i = 0; i < len1; i++){
if (s1[i] == s2[j])
break;
}
if (i == len1)
number3[index++] = s2[j];
}
if (index == 0) number3[0] = '\0';
sort(number3, index);
}
void function4(char s1[], int len1, char s2[], int len2){//不在s1也不在s2 26个字母
char t = 'a';
int i,j;
int index = 0;
char number[26];
for (i = 0; i < 26; i++)
{
number[i] = t;
t++;
}
int len = strlen(number1);
for (i = 0; i < 26; i++){
for (j = 0; j < len; j++){
if (number[i] == number1[j])
break;
}
if (j == len)
number4[index++] = number[i];
}
if (index == 0) number4[0] = '\0';
sort(number4, index);
}
int main(){
char s1[26];
char s2[26];
while (scanf("%s%s", s1, s2) != EOF){
int i;
//for (i = 0; i < 26; i++)//清空数组的另一种办法
/*{
number1[i] = '\0';
number2[i] = '\0';
number3[i] = '\0';
number4[i] = '\0';
}*/
memset(number1,0,sizeof(number1));//经测试memset函数可以用
memset(number2,0,sizeof(number2));
memset(number3,0,sizeof(number3));
memset(number4,0,sizeof(number4));
int len1 = strlen(s1);
int len2 = strlen(s2);
sort(s1, len1);
sort(s2, len2);
len1 = strlen(s1);
len2 = strlen(s2);
printf("in s1 or s2:");
function1(s1, len1, s2, len2);
printf("%s\n", number1);
printf("in s1 and s2:");
function2(s1, len1, s2, len2);
printf("%s\n", number2);
printf("in s1 but not in s2 ,or in s2 but not in s1:");
function3(s1, len1, s2, len2);
printf("%s\n", number3);
printf("not in s1 and s2:");
function4(s1, len1, s2, len2);
printf("%s\n", number4);
printf("\n");
}
return 0;
}
小结:全局数组变量清空尤其要注意(方法不对就会导致下次再用时会留下残留的)