说无可说

本文介绍了一个基于字符串编辑距离的问题,探讨了如何计算两个字符串之间的相似度,并提供了一段C++代码实现,该算法用于找出一组字符串中相似度为特定值的字符串对数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

“What’s left to say when every word’s been spoken?”
“若沉默再无休止,是否已经说无可说?”
——来自网易云音乐
沉默之中,我已不懂言语。
幻觉中,有人在轻声低吟。
那是谁?
我听见,那个人说了N句话,然而好多话都是重复或者类似,比沉默更加让人不堪。
打破不堪,我想。
每句话是由若干个小写字母组成的字符串。
字符串A和B的相似度定义如下:
<字符串A通过以下三种操作:1、插入一个字符;2、删除一个字符;3、替换一个字符. 变成字符串B的最少操作次数>
比如字符串‘abcd’变成‘ccd’的最少次数是2:
首先,删掉字符“a”得到‘bcd’,然后,将‘b’变成‘c’,得到‘ccd’。
给出N个字符串,求出相似度分别为1,2,3,4,5,6,7,8的字符串对数。

暴力

xjb玄学。
copy标程过~

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

#define MAXN 210
#define MAXM 1000010

using namespace std;

string s[MAXN];
int len[MAXN];
char *a;
char *b;
int n;
int ans[10],ans1;

void work(int i,int j,int leni,int lenj,int cnt)
{
    if(cnt+abs(leni-i+j-lenj)>=ans1)return;
    while(i<leni&&j<lenj)
    {
        if(a[i]!=b[j])
        {
            work(i+1,j+1,leni,lenj,cnt+1);
            work(i+1,j,leni,lenj,cnt+1);
            work(i,j+1,leni,lenj,cnt+1);
            return;
        }
        i++;j++;
    }
    if(i==leni)ans1=min(ans1,cnt+lenj-j);
    else ans1=min(ans1,cnt+leni-i);
}

int main()
{
    freopen("say.in","r",stdin);
    freopen("say.out","w",stdout);
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        cin>>s[i];
        len[i]=strlen(s[i].c_str());
    }
    for(int i=0;i<n;i++)
    {
        a=(char*)s[i].c_str();
        for(int j=i+1;j<n;j++)
        {
            b=(char*)s[j].c_str();
            ans1=9;
            work(0,0,len[i],len[j],0);
            ans[ans1]++;
        }
    }
    for(int i=1;i<8;i++)printf("%d ",ans[i]);
    printf("%d\n",ans[8]);
    fclose(stdin);
    fclose(stdout);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值