1 solutions
-
0
解题思路
这道题是计算两个字符串(作为字母集合)的相似度。
步骤:
- 读取两个字符串
- 将每个字符串转换为字符集合(去重)
- 计算交集大小
- 计算并集大小
- 计算相似度 = 交集 / 并集
集合实现:
- 使用
set<char>自动去重 - 或者使用布尔数组
bool[26]
参考代码
方法1:使用set
#include <bits/stdc++.h> using namespace std; int main() { string s1, s2; cin >> s1 >> s2; set<char> set1, set2; for (char c : s1) set1.insert(c); for (char c : s2) set2.insert(c); // 计算交集 set<char> inter; for (char c : set1) { if (set2.count(c)) inter.insert(c); } // 计算并集 set<char> uni; for (char c : set1) uni.insert(c); for (char c : set2) uni.insert(c); double ans = (double)inter.size() / uni.size(); cout << fixed << setprecision(2) << ans << endl; return 0; }方法2:使用数组(更高效)
#include <bits/stdc++.h> using namespace std; int main() { string s1, s2; cin >> s1 >> s2; bool in1[26] = {false}, in2[26] = {false}; for (char c : s1) in1[c - 'a'] = true; for (char c : s2) in2[c - 'a'] = true; int inter = 0, uni = 0; for (int i = 0; i < 26; i++) { if (in1[i] && in2[i]) inter++; if (in1[i] || in2[i]) uni++; } double ans = (double)inter / uni; cout << fixed << setprecision(2) << ans << endl; return 0; }代码解释
- 读取两个字符串
- 用布尔数组标记每个字符串中出现的字符
- 遍历26个字母,计算:
- 交集:在两个数组中都为true的字母
- 并集:在至少一个数组中为true的字母
- 计算相似度并输出,保留2位小数
复杂度分析
- 时间复杂度:O(n + m),其中 n、m 为字符串长度
- 空间复杂度:O(1) - 只需要26个布尔变量
Information
- ID
- 502
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 9
- Tags
- (None)
- # Submissions
- 10
- Accepted
- 4
- Uploaded By