东华oj-进阶题第66题-字符串统计

在这里插入图片描述

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

原来的代码:

/*
	T66 字符串统计 
	第一种情况:即两字符串的并集。将两字符串连接起来后排序,再去重 
	第二种情况:即两字符串的交集。将两字符串分别去重,排序,再取前一段相同字符 
	第三种情况:str1去掉二者交集与str2去掉二者交集的并集
				也就是在第一种情况中去掉第二种情况 
	第四种情况:即在全部26个字母中抠掉第一种情况。
*/ 

#include<stdio.h>
#include<string.h>
#define MAX_SIZE 27

void sortByAlphabet(char str[]);
void removeDupl(char str[]); 

int main() {
   
	char str1[MAX_SIZE] = "";
	char str2[MAX_SIZE] = "";
	char res[MAX_SIZE] = "";// 每种情况的结果 
	char resTemp[MAX_SIZE] = "";
	char temp1[MAX_SIZE] = "";
	char temp2[MAX_SIZE] = "";
	int count = 0;
	int i = 0, j = 0, k = 0;
	int len1 = 0, len2 = 0, len = 0;
	int flag = 0;
	char characters[26] = "";
	
	while (scanf("%s", str1) != EOF) {
   
		scanf("%s", str2);// 注意输出还要加点东西 
		
		for (i = 0; i < 26; i++) {
   
			characters[i] = 'a' + i;
		}
		characters[26] = '\0';
		
		len1 = strlen(str1);
		len2 = strlen(str2);
		strcpy(temp1, str1);
		strcpy(temp2, str2);
		
		// 第一种 
		strcpy(res, strcat(str1, str2));// 连接
		sortByAlphabet(res);// 排序
		removeDupl(res);// 去重
		printf("in s1 or s2:%s\n", res);
		for (i = 0; i < strlen(res); i++)
			resTemp[i] = res[i];
		resTemp[i] = '\0';
		printf("resTemp=%s\n", resTemp);
		
		strcpy(resTemp, res);// 将res存下来 ******************************************	// 这里怎么会有问题???? 
		
		// 第二种 
		flag = 0;
		for (i = 0; i < len1; i++) {
   
			for (j = 0; j < len2; j++) {
   
				if (temp1[i] == temp2[j]) {
   // 有相同字符 
					flag = 1;
					break;
				}
			}
		}
		if (flag) {
   
			removeDupl(temp1);
			removeDupl(temp2);
			sortByAlphabet(temp1);
			sortByAlphabet(temp2);
			i = len1 <= len2 ? len1 : len2;
			temp1[i] = '\0'; 
			printf("in s1 and s2:%s\n", temp1);
		} 
		else {
   
			temp1[0] = '\0';
			printf("in s1 and s2:\n");
		} 
		
		// 第三种 
		if (strlen(temp1) == 0) {
   // 两字符串没有交集,则就是第一种情况 
			printf("in s1 but not in s2 ,or in s2 but not in s1:%s\n", resTemp);
		}
		else {
   
			len = strlen(resTemp);
			for (i = 0; i < strlen(resTemp); i++) {
   
				for (j = 0; j < strlen(temp1); j++) {
   
					if (resTemp[i] == temp1[j]) {
   // 将相同元素删除 
						for (k = i; k < len - 1; k++) {
   
							resTemp[k] = resTemp[k + 1];
						}
						resTemp[len - 1] = '\0';
						len--;
					}
				}
			}
			printf("in s1 but not in s2 ,or in s2 but not in s1:%s\n", resTemp);
		}
		
		// 第四种
		len = strlen(characters);
		for (i = 0; i < len; i++) {
   
			for (j = 0; j < strlen(res); j++) {
   
				if (characters[i] == res[j]) {
   // 将相同元素删除 
					for (k = i; k 
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值