zoukankan      html  css  js  c++  java
  • PTA 7-44 基于词频的文件相似度(字符串处理+set容器)

    本题考点:

    • 字符串处理
    • set 容器使用

    实现一种简单原始的文件相似度计算,即以两文件的公共词汇占总词汇的比例来定义相似度。为简化问题,这里不考虑中文(因为分词太难了),只考虑长度不小于3、且不超过10的英文单词,长度超过10的只考虑前10个字母。
    输入格式:
    输入首先给出正整数N(≤100),为文件总数。随后按以下格式给出每个文件的内容:首先给出文件正文,最后在一行中只给出一个字符#,表示文件结束。在N个文件内容结束之后,给出查询总数M(≤10
    ​4
    ​​ ),随后M行,每行给出一对文件编号,其间以空格分隔。这里假设文件按给出的顺序从1到N编号。
    输出格式:
    针对每一条查询,在一行中输出两文件的相似度,即两文件的公共词汇量占两文件总词汇量的百分比,精确到小数点后1位。注意这里的一个“单词”只包括仅由英文字母组成的、长度不小于3、且不超过10的英文单词,长度超过10的只考虑前10个字母。单词间以任何非英文字母隔开。另外,大小写不同的同一单词被认为是相同的单词,例如“You”和“you”是同一个单词。
    输入样例:
    3
    Aaa Bbb Ccc
    #
    Bbb Ccc Ddd
    #
    Aaa2 ccc Eee
    is at Ddd@Fff
    #
    2
    1 2
    1 3
    输出样例:
    50.0%
    33.3%

    本题主要是对字符串的处理,我们需要读取每一行的数据,然后根据是否是英文字母,来进行处理分段,然后使用 set 容器来进行不同数据的存储。

    今年疫情在家,有时候因为有事,有很多杂事要处理,所以效率不高,我还有很多目标要去实现,还有很多事情要去做,我的人生会很精彩,加油!

    完整代码如下:

    #include <iostream>
    #include <set>
    #include <string>
    #include <cctype>
    using namespace std;
    
    #define MAXN 105
    
    int N, M;                // 文件总数,查询总数
    string str;              // 读取每一行
    set<string> files[MAXN]; // 文件中的单词
    
    void handleStr(string str, int No)
    {
        string word;
        str += "."; // 最后一个单词能够处理
        for (int i = 0; i < str.size(); i++)
        {
            if (isalpha(str[i]))
            {
                if (word.size() < 10)
                    word += tolower(str[i]);
            }
            else
            {
                if (word.size() > 2 && word.size() < 11)
                    files[No].insert(word);
                word.clear();
            }
        }
    }
    
    int main()
    {
        scanf("%d", &N);
        for (int i = 1; i <= N; i++)
        {
            do
            {
                getline(cin, str);
                handleStr(str, i);
            } while (str != "#");
        }
        scanf("%d", &M);
        int u, v;
        int same = 0, total = 0;
        for (int i = 0; i < M; i++)
        {
            scanf("%d%d", &u, &v);
            total = (int)files[u].size() + (int)files[v].size();
            same = 0;
            for (set<string>::iterator it = files[u].begin(); it != files[u].end(); it++)
            {
                if(files[v].find(*it) != files[v].end())
                {
                    same++;
                    total--;
                }
            }
            printf("%.1f%%
    ", total == 0 ? 0 : same * 100.0 / total);
        }
        return 0;
    }
    
  • 相关阅读:
    关于longPressGesture做一个长按连加的效果(原创)
    借助TZImagePickerController三方库理解自定义相册
    关于instrinsicContentSize, ContentHuggingPriority, ContentcompressionResistancePriority的理解
    开发小总结
    iOS开发之emoji处理
    C的枚举(转)
    C语言输出格式总结(转)
    Xcode的使用技巧
    Mac的快捷键(工欲善其事必先利其器)
    我是一只萌新
  • 原文地址:https://www.cnblogs.com/veeupup/p/12682158.html
Copyright © 2011-2022 走看看