有两个长度相同的字符串,均由字母A-Z构成,长度不超过100。请判断是否可以把其中一个字符串的各个字母重排,然后对26个字母做一个一一映射,使得两个字符串相同。用c语言完成
时间: 2023-06-14 17:06:19 浏览: 224
C语言程序设计-对长度为8个字符的字符串,将8个字符按降序排列;例如:原来的字符串为CEAedcab,排序后输出为edcbaE
5星 · 资源好评率100%
可以通过统计两个字符串中各个字母出现的次数来判断是否可以重排,并且可以用数组记录字母的映射关系。具体实现如下:
```c
#include <stdio.h>
#include <string.h>
int main()
{
char str1[101], str2[101];
int count1[26] = {0}, count2[26] = {0};
int map[26] = {0}; // 字母映射关系
printf("请输入两个字符串:\n");
scanf("%s%s", str1, str2);
int len1 = strlen(str1), len2 = strlen(str2);
if (len1 != len2) {
printf("两个字符串长度不同,无法重排映射\n");
return 0;
}
// 统计字母出现次数
for (int i = 0; i < len1; i++) {
count1[str1[i] - 'A']++;
count2[str2[i] - 'A']++;
}
// 判断是否可以重排
for (int i = 0; i < 26; i++) {
if (count1[i] != count2[i]) {
printf("两个字符串中字母出现次数不同,无法重排映射\n");
return 0;
}
}
// 建立映射关系
for (int i = 0; i < len1; i++) {
int ch1 = str1[i] - 'A', ch2 = str2[i] - 'A';
if (!map[ch1]) { // 如果ch1还未映射
map[ch1] = ch2;
} else if (map[ch1] != ch2) { // 如果ch1的映射与ch2不同
printf("两个字符串无法重排映射\n");
return 0;
}
}
printf("可以重排映射\n");
return 0;
}
```
其中,`count1`和`count2`数组分别记录两个字符串中各个字母出现的次数,判断是否可以重排;`map`数组记录字母的映射关系。如果两个字符串中字母出现次数不同或者某个字母已经映射到不同的字母,则无法重排映射。否则,可以重排映射。
阅读全文