C语言有两个长度相同的字符串,均由字母A-Z构成,长度不超过100。请判断是否可以把其中一个字符串的各个字母重排,然后对26个字母做一个一一映射,使得两个字符串相同。 如JWPUDJSTVP重排后可以得到WJDUPSJPVT,然后把每个字母映射到它前一个字母(B->A, C->B, ..., Z->Y, A->Z),得到VICTORIOUS。
时间: 2023-05-30 14:02:38 浏览: 118
思路:
1. 首先判断两个字符串的长度是否相等,如果不相等则肯定不能重排得到相同的字符串,直接返回false。
2. 统计两个字符串中各个字母出现的次数,如果不同则肯定不能重排得到相同的字符串,直接返回false。
3. 将其中一个字符串重排,使得它与另一个字符串相同。
4. 对26个字母进行映射,得到最终的字符串。
代码实现:
```c
#include <stdio.h>
#include <string.h>
int main()
{
char str1[101], str2[101];
int count1[26] = {0}, count2[26] = {0};
int i, j, len;
scanf("%s%s", str1, str2);
len = strlen(str1);
if (len != strlen(str2)) {
printf("false\n");
return 0;
}
for (i = 0; i < len; i++) {
count1[str1[i] - 'A']++;
count2[str2[i] - 'A']++;
}
for (i = 0; i < 26; i++) {
if (count1[i] != count2[i]) {
printf("false\n");
return 0;
}
}
for (i = 0; i < len - 1; i++) {
for (j = i + 1; j < len; j++) {
if (str1[i] > str1[j]) {
char tmp = str1[i];
str1[i] = str1[j];
str1[j] = tmp;
}
}
}
for (i = 0; i < len; i++) {
str1[i] = (str1[i] - 'A' + 25) % 26 + 'A';
}
if (strcmp(str1, str2) == 0) {
printf("true\n");
} else {
printf("false\n");
}
return 0;
}
```
阅读全文