题目来源:码蹄集
题目描述:
大致思路:
这道题可以使用哈希表来解决。对于每个单词,我们可以统计其中每个字母出现的次数,并把这些次数作为一个数组或者字符串表示该单词。如果两个单词可以分为一类,则它们的这个数组或者字符串是相同的。
具体步骤如下:
- 遍历每个单词,统计每个单词中每个字母出现的次数,并将它们组成一个字符串或者数组。
- 将第 1 步得到的字符串或者数组作为键,存入一个哈希表中。如果这个键已经存在,则将当前单词加入到哈希表中对应的值中(可能是一个数组)。
- 最后,哈希表中键的个数即为单词被分为的类数。
时间复杂度为 O(n*len),其中 len 表示单词的长度。
Python代码实现:
n = int(input())
a = set()
for i in range(n):
ch = input()
b = [0] * 26
for j in range(len(ch)):
b[ord(ch[j]) - ord('A')] += 1
a.add(str(b))
print(len(a))
C++代码实现:
#include <iostream>
#include <string>
#include <unordered_set>
using namespace std;
int main() {
int n;
cin >> n;
unordered_set<string> a;
for (int i = 0; i < n; i++) {
string s;
cin >> s;
int b[26] = {0};
for (int j = 0; j < s.length(); j++) {
b[s[j] - 'A']++;
}
string str;
for (int j = 0; j < 26; j++) {
str += to_string(b[j]);
}
a.insert(str);
}
cout << a.size() << endl;
return 0;
}
Java代码实现:
参考链接:https://blog.51cto.com/u_15745546/5950610
import java.util.Scanner;
import java.util.*;
class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = Integer.parseInt(input.next());
Set<String> a = new HashSet<>();
for (int i = 0; i < n; i++) {
char[] ch = input.next().toCharArray();
int[] b = new int[26];
for (int j = 0; j < ch.length; j++) {
b[ch[j] - 'A']++;
}
a.add(Arrays.toString(b));
}
System.out.println(a.size());
input.close();
}
}
代码提交测试结果:
附B站老师思路讲解:https://www.bilibili.com/video/BV1Ua4y1V7qX/?t=1872.9