【智能查询】:关于智能查找输入的算法实现1

问题描述

在生活中我们总有这样的情况,比如说不记得某个单词,然后就大概的去查找该单词,这样就会导致输错的情况,这篇文章实现的算法就是想让用户在输错的情况下如何也能智能匹配到该单词。
举个例子:

字符串为apple 我输入了pplea,这样五个字母都是一致的,只是顺序不一样而已,因此能够认为该用户输对了单词,进行准确的查找
可以参照:刘汝佳 算法入门 字符串模块等章节

解题思路

对字符串进行处理,想要查找到混序输入的单词,如果和原单词进行匹配查找,肯定够呛,这样我就想到了一个很巧妙的方法,对单词进行排序,这样一个混乱的单词都能进行排序得到一个一致的序列,这样最后就能够进行模式匹配了~

举个例子:
对apple排序会得到 aelpp,就是会把小的字符放前面~~

录入字典模块,我不是在控制台录入的,而是在txt文档中录入的,参考我一篇博文:

http://blog.csdn.net/qq_23100787/article/details/48545455

源代码:

//这个程序的目的是给出一个字符串字典,然后输入乱序字符串,能否在字符字典里面找到该有的字符串
// author:seen
// 2015-09-20


#include <iostream>
#include <string>
#include <algorithm>
#include <fstream>
using namespace std;
struct Photograph{     //保存单词
    string s; 
}P[100];
struct RES{         //保存单词每个字母排序后的结果
    string s;
}R[100];
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;
        R[count].s = SelectS(P[count].s); //把录入的单词排序保存进结果结构体
        count++;
    }
    f.close();

    //导入数据查看
    cout<<"导入的数据形成的字典为"<<endl;
    for(int i=0;i<count;i++) cout<<P[i].s<<endl;

    // 接下来是比对的过程
    string temp;
    cin>>temp;
    for(i=0;i<count;i++){
        if(SelectS(temp)==R[i].s){
            cout<<"已经找到,其原单词为"<<P[i].s<<endl;
            return 0;
        }
    }
    return 0;
}

程序运行结果

数据字典截图:
【智能查询】:关于智能查找输入的算法实现1_第1张图片

程序运行:
【智能查询】:关于智能查找输入的算法实现1_第2张图片

你可能感兴趣的:(算法,智能查找)