判断两个字符串是否为变形词
题目描述
给定两个字符串str1和str2,如果str1和str2中出现的字符种类出现的一样且每种字符出现的次数也一样,那么str1和str2互为变形词。请判断str1和str2是否为变形词。
输入描述:
输入包括3行,第一行包含两个整数n,m ( 1 ≤ n , m ≤ 1 0 5 ) (1 \leq n,m\leq 10^5) (1≤n,m≤105)分别代表str1和str2的长度,第二行和第三行为两个字符串,分别代表str1和str2。
输出描述:
如果str1和str2互为变形词,请输出“true”,否则输出“false”。
示例1
输入
3 3
123
321
输出
true
示例2
输入
3 4
123
2331
输出
false
备注:
时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( n ) O(n) O(n)。
题解:
使用哈希表统计两个字符串中的各个字符数目,不相等则不是互为变形词。
注意:字符串带空格,scanf 输入会 gg。
代码:
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 1e5 + 10;
const int M = 256;
char str1[N];
char str2[N];
int num[M];
int main(void) {
int n, m;
scanf("%d%d", &n, &m);
if (n != m) return 0 * puts("false");
getchar();
gets(str1);
gets(str2);
for (int i = 0; i < n; ++i) ++num[str1[i]];
for (int i = 0; i < m; ++i) {
if (!num[str2[i]]) return 0 * puts("false");
--num[str2[i]];
}
return 0 * puts("true");
}