有两个长度相同的字符串,均由字母A-Z构成,长度不超过100。请判断是否可以把其中一个字符串的各个字母重排,然后对26个字母做一个一一映射,使得两个字符串相同。
时间: 2023-06-14 08:06:25 浏览: 138
可以使用一个长度为26的数组来记录每个字母出现的次数,然后分别统计两个字符串中每个字母出现的次数,最后比较两个数组是否相同即可。
具体步骤如下:
1. 定义一个长度为26的数组count,用于记录每个字母出现的次数,初始化为0。
2. 遍历第一个字符串,统计每个字母出现的次数,将其记录在count数组中。
3. 遍历第二个字符串,统计每个字母出现的次数,将其记录在另一个数组temp中。
4. 比较count数组和temp数组是否相同,如果相同,则说明可以通过重排第一个字符串中的字母,对26个字母做一个一一映射,使得两个字符串相同;否则不行。
代码实现如下:
```python
def is_permutation(str1, str2):
if len(str1) != len(str2):
return False
count = [0] * 26
for c in str1:
count[ord(c) - ord('A')] += 1
for c in str2:
count[ord(c) - ord('A')] -= 1
if count[ord(c) - ord('A')] < 0:
return False
return True
```
其中,ord(c) - ord('A') 表示将字母转换为对应的数组下标。
相关问题
有两个长度相同的字符串,均由字母A-Z构成,长度不超过100。请判断是否可以把其中一个字符串的各个字母重排,然后对26个字母做一个一一映射,使得两个字符串相同
解题思路:
首先判断两个字符串的长度是否相等,不相等则一定不能重排后一一映射。
然后统计两个字符串中各个字母出现的次数,如果不同则一定不能重排后一一映射。
最后判断能否将一个字符串中的各个字母重排后映射到另一个字符串中的各个字母,可以用哈希表记录映射关系,如果映射关系出现冲突则不能重排后一一映射。
Python代码实现:
c语言写代码:有两个长度相同的字符串,均由字母A-Z构成,长度不超过100。请判断是否可以把其中一个字符串的各个字母重排,然后对26个字母做一个一一映射,使得两个字符串相同。输入 两行字符串。 输出 若可以请输出两行,第一行为YES,第二行为对应的一个映射。否则输出NO。
可以使用计数排序的思想解决这个问题。先统计两个字符串中每个字母出现的次数,若两个字符串每个字母出现次数完全相同,则可以通过重排实现映射,输出YES和对应的一一映射;否则输出NO。
以下是C语言代码实现:
#include <stdio.h>
#include <string.h>
int main()
{
char s1[101], s2[101];
int count1[26] = {0}, count2[26] = {0};
int i, j, flag = 1;
scanf("%s%s", s1, s2);
if (strlen(s1) != strlen(s2)) {
printf("NO\n");
return 0;
}
for (i = 0; i < strlen(s1); i++) {
count1[s1[i] - 'A']++;
count2[s2[i] - 'A']++;
}
for (i = 0; i < 26; i++) {
if (count1[i] != count2[i]) {
flag = 0;
break;
}
}
if (flag) {
printf("YES\n");
for (i = 0; i < 26; i++) {
if (count1[i] > 0) {
printf("%c-%c\n", i + 'A', i + 'A');
count1[i]--;
}
for (j = 0; j < count1[i]; j++) {
printf("%c-%c\n", i + 'A', i + j + 1 + 'A');
}
}
} else {
printf("NO\n");
}
return 0;
}
阅读全文