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%%\n", total == 0 ? 0 : same * 100.0 / total);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章