【模式匹配】:关于模式匹配的算法实现2

前言

在上篇博客中,我完成了这么一个功能,输入一个单词的混序,然后从数据字典中查找该单词。于是我当时想到一个问题:
我输入的混序词应该是要和被查找的单词是等长的,如果不等长,那么怎么查询?这就是我这篇博客的由来.
举个例子:
查找apple,在上篇我需要输入a p p l e五个字符的混序输入,
在这篇文章实现的算法中,我只需要实现输入 a p p 即可,这样它的匹配率会达到0.6,如果没有其他的字典高于这个匹配率,这样就能查找出apple这个单词

思路

参照我上篇博客,只不过多了一个识别率的算法而已,还是参考归并排序写的,很简单。
上篇博客地址
很多的解释都在代码里面了,各位看看就明白了

代码

// author:seen
// time:2015-09-20
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
struct Photograph{     //s保存原来的单词,res保存排序之后的单个单词,value记录匹配率
    string s,res; 
    float value;
}P[100];
string s1,s2,res1,res2;
float find(string s1,string s2){         //返回两个字符串的模式匹配率
    int i=0,j=0,count=0;
    while(i<s1.length() && j<s2.length()){  //用到了类似于归并排序的算法
        if(s1[i]==s2[j]) { count++;i++;j++;}
        if(s1[i]<s2[j]) { i++;continue;}
        if(s1[i]>s2[j]) {j++;continue;}
    }
    return (float)count/s1.length();
}
string SelectS(string s){               //给单个单词进行内部单个字符的排序操作
    string s_temp = s;
    for(int i=0;i<s_temp.length();i++){
        for(int j=i+1;j<s_temp.length();j++){
            if(s_temp[j]<s_temp[i]){
                char temp = s_temp[i];
                s_temp[i] = s_temp[j];
                s_temp[j] = temp;
            }
        }
    }
    return s_temp;
}
int main()
{
    //这段代码是录入字典的过程
    fstream f("d:\\数据.txt",ios::in);
    if(!f) cout<<"mistake";
    int count=0;
    while(!f.eof()){
        f>>P[count].s;
        P[count].res = SelectS(P[count].s);   //用同个结构体里面的res字符串来接受内部排序的单词
        count++;
    }
    f.close();

    string temp;
    cin>>temp;
    for(int i=0;i<count;i++){
        P[i].value = find(P[i].res,SelectS(temp));      //获的每个字符串的模式匹配率,这里居然还出了问题=_=
        cout<<P[i].value<<endl;
    }

    //查找最大值及输出该字符串的过程
    float   max = P[0].value;
    int pos=0;
    for(i=1;i<count;i++){
        if(P[i].value>max){
            max = P[i].value;
            pos = i;
        }
    }
    cout<<"匹配的字符串最可能为"<<P[pos].s<<endl;
}

运行截图

数据字典内容:
这里写图片描述

程序运行内容:
这里写图片描述

字符串下面的那些小数是指的各个数据的匹配率~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值