模糊匹配算法

项目中需要对车牌号码进行模糊匹配,比如5位数相同就认为车牌号码匹配成功。

 

参考:

字符串模糊匹配使用递归实现 - CSDN博客  http://blog.csdn.net/damenggege123/article/details/8213500

字符串模糊匹配递归实现优化1 - CSDN博客  http://blog.csdn.net/damenggege123/article/details/8213919

实际上我的实现就是将上面博客中的java代码改成了c++代码而已,所以非常感谢上面的博主!

下面是修改后的C++实现:

.h文件:

#include <string>
using namespace std;

class CMatch
{
public:
CMatch();
~CMatch();

public:

/**
* 百分之多少之内匹配错误可以接受
* a与ab匹配为百分之50的错误率。
* @param percent 设置匹配百分比
* @param src 字符串1
* @param dest 字符串2
* @param hander 匹配规则
* @return
*/
bool Match(double percent,string src,string dest);

/**
* 几个错误的字符可以接受
* a与ab为1个字符错误可以接受
* @param percent 设置匹配百分比
* @param src 字符串1
* @param dest 字符串2
* @param hander 匹配规则
* @return
*/
bool Match(int errorNum, string src,string dest);

private:
int CalcMatchNumber(string src, int i, string dest, int j, int curdeep,int maxdeep);

};

 

 

.cpp文件

#include "Match.h"
#include <math.h>


CMatch::CMatch()
{

}


CMatch::~CMatch()
{

}

bool CMatch::Match( double percent,string src,string dest )
{

int score = 0;
int max = src.size() > dest.size() ? src.size(): dest.size();
score = CalcMatchNumber(src, 0, dest, 0, 0, (int)ceil((1-percent)*max) );

return score/max > percent;

}

bool CMatch::Match( int errorNum, string src,string dest )
{


int score = CalcMatchNumber(src, 0, dest, 0, 0, errorNum );
int max = src.size() > dest.size() ? src.size(): dest.size();
return max - score <= errorNum;

}

int CMatch::CalcMatchNumber( string src, int i, string dest, int j, int curdeep,int maxdeep )
{

 

int score = 0;
if( curdeep > maxdeep ||i >= src.size() || j >= dest.size())
return 0;
//bool ismatch = hander.compare(csrc[i], cdest[j]);

if( src[i] == dest[j] )
{
score++;
if(i+1<src.size() && j+1<dest.size())
{
score += CalcMatchNumber(src, i+1, dest, j+1, 0,maxdeep);
}

}
else
{
int temp1 = 0;
int temp2 = 0;
int temp3 = 0;
temp1 += CalcMatchNumber(src, i, dest, j+1, curdeep+1,maxdeep) ;
temp2 += CalcMatchNumber(src, i+1, dest, j, curdeep+1,maxdeep) ;
temp3 += CalcMatchNumber(src, i+1, dest, j+1, curdeep+1,maxdeep) ;
int temp4 = std::max(temp1, temp2);
score += std::max(temp3, temp4);
}
return score;

}

 

 

使用示例:

string str1 = "辽A56633";
string str2 = "辽A56635";
string str3 = "吉A54633";


CMatch matcher;
bool bRet = matcher.Match(5, str1, str3);

 

 

其他参考资料:

 

posted on 2018-02-23 17:32  南枝  阅读(6777)  评论(0编辑  收藏  举报