1 solutions

  • 0
    @ 2026-4-17 16:06:00

    解题思路

    这道题是计算两个字符串(作为字母集合)的相似度。

    步骤

    1. 读取两个字符串
    2. 将每个字符串转换为字符集合(去重)
    3. 计算交集大小
    4. 计算并集大小
    5. 计算相似度 = 交集 / 并集

    集合实现

    • 使用 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;
    }
    

    代码解释

    1. 读取两个字符串
    2. 用布尔数组标记每个字符串中出现的字符
    3. 遍历26个字母,计算:
      • 交集:在两个数组中都为true的字母
      • 并集:在至少一个数组中为true的字母
    4. 计算相似度并输出,保留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