判断两个字符串是否为变形词

判断两个字符串是否为变形词

题目描述

给定两个字符串str1和str2,如果str1和str2中出现的字符种类出现的一样且每种字符出现的次数也一样,那么str1和str2互为变形词。请判断str1和str2是否为变形词。

输入描述:

输入包括3行,第一行包含两个整数n,m ( 1 ≤ n , m ≤ 1 0 5 ) (1 \leq n,m\leq 10^5) (1n,m105)分别代表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");
}

猜你喜欢

转载自blog.csdn.net/MIC10086/article/details/108708611