数据结构与算法题目集(中文) - 7-44 基于词频的文件相似度(30 分)

简介: 数据结构与算法题目集(中文) - 7-44 基于词频的文件相似度(30 分)

题目链接:点击打开链接

题目大意:略。

解题思路:


1、单词筛选(考虑长度)并统一大或小写。

2、set 自带去重统计 + st.size()(用 set 存放且用 set 统计)。

3、注意:一开始存放的时候,直接去重。

4、用 set count 来做最后的统计,否则用其他容器统计完又清空会 TLE。

AC 代码

#include<bits/stdc++.h>
#include<cmath>
#define mem(a,b) memset(a,b,sizeof a);
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
set<string> st[110];
int main()
{
    int n;
    char ts[15],s[100];
    while(~scanf("%d",&n))
    {
        int kase=1;
        for(int i=0;i<110;i++) st[i].clear();
        while(~scanf("%s",s))
        {
            int len=strlen(s),k=0;
            if(s[0]=='#' && len==1)
            {
                if(kase++==n) break;
            }
            for(int i=0;i<len;i++)
            {
                if(s[i]>='a'&&s[i]<='z') s[i]=toupper(s[i]);
            }
            for(int i=0,f=0;i<len;i++)
            {
                char c=s[i];
                if(isupper(c))
                {
                    if(f) continue;
                    ts[k++]=c;
                    if(k>=10) // 超过10,有字符分隔else会处理,没有字符分隔这边处理
                    {
                        ts[k++]='\0';
                        f=1;
                        k=0; // 避免与for外面的判断混淆
                        st[kase].insert(ts);
                    }
                }
                else // 有字符分隔
                {
                    if(!f) // 没超过10
                    {
                        if(k>=3)
                        {
                            ts[k++]='\0';
                            st[kase].insert(ts);
                        }
                    }
                    else; // 超过10
                    f=0;
                    k=0;
                }
            }
            if(k>=3)
            {
                ts[k++]='\0';
                st[kase].insert(ts);
            }
        }
//        for(int i=1;i<=n;i++)
//        {
//            printf("%d:\n",i);
//            for(set<string>::iterator it=st[i].begin();it!=st[i].end();it++)
//            {
//                printf("%s ",(*it).c_str());
//            }
//            puts("\n-----------------");
//        }
        int m,a,b; scanf("%d",&m);
        for(int i=0,up;i<m;i++)
        {
            up=0;
            scanf("%d%d",&a,&b);
            int mi=min(st[a].size(),st[b].size());
            if(st[a].size()==mi)
            {
                for(set<string>::iterator it=st[a].begin();it!=st[a].end();it++)
                    if(st[b].count(*it)==1) up++;
            }
            else
            {
                for(set<string>::iterator it=st[b].begin();it!=st[b].end();it++)
                    if(st[a].count(*it)==1) up++;
            }
            printf("%.1f%%\n",up*1.0/(st[a].size()+st[b].size()-up)*100);
        }
    }
    return 0;
}
目录
相关文章
|
6月前
|
存储 SQL 算法
LeetCode题目113:多种算法实现 路径总和ll
LeetCode题目113:多种算法实现 路径总和ll
|
2月前
|
存储 C语言
栈和队列题目练习
栈和队列题目练习
20 0
|
4月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
57 6
|
5月前
|
自然语言处理 算法 搜索推荐
字符串相似度算法完全指南:编辑、令牌与序列三类算法的全面解析与深入分析
在自然语言处理领域,人们经常需要比较字符串,这些字符串可能是单词、句子、段落甚至是整个文档。如何快速判断两个单词或句子是否相似,或者相似度是好还是差。这类似于我们使用手机打错一个词,但手机会建议正确的词来修正它,那么这种如何判断字符串相似度呢?本文将详细介绍这个问题。
309 1
|
6月前
|
算法
【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素
【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素
|
5月前
|
算法
Ngnix02 --- Ngnix的功能特性及常见功能,Ngnix常用的功能模块,有不同算法,根据不同算法进行转发,ip_hash、url_hash、fair,核心组成 ngnix二进制可执行文件
Ngnix02 --- Ngnix的功能特性及常见功能,Ngnix常用的功能模块,有不同算法,根据不同算法进行转发,ip_hash、url_hash、fair,核心组成 ngnix二进制可执行文件
|
6月前
|
人工智能 算法 搜索推荐
蓝桥杯宝藏排序题目算法(冒泡、选择、插入)
以下是内容的摘要: 本文介绍了三种排序算法:冒泡排序、选择排序和插入排序。冒泡排序通过不断交换相邻的逆序元素逐步排序,最坏情况下需要 O(n^2) 次比较。选择排序在每轮中找到剩余部分的最小元素并放到已排序序列的末尾,同样具有 O(n^2) 时间复杂度。插入排序则是将每个元素插入到已排序序列的正确位置,时间复杂度也是 O(n^2),但空间复杂度为 O(1)。
|
6月前
|
算法
【经典LeetCode算法题目专栏分类】【第11期】递归问题:字母大小写全排列、括号生成
【经典LeetCode算法题目专栏分类】【第11期】递归问题:字母大小写全排列、括号生成
|
6月前
|
算法
【经典LeetCode算法题目专栏分类】【第9期】深度优先搜索DFS与并查集:括号生成、岛屿问题、扫雷游戏
【经典LeetCode算法题目专栏分类】【第9期】深度优先搜索DFS与并查集:括号生成、岛屿问题、扫雷游戏
下一篇
DataWorks