计算两个字符串之间是否包含的简单方法
在前面介绍了两个字符串之间的匹配度 的算法
计算字符串相似度算法—Levenshtein
它解决了字符串A和B之间的相识度的问题,但是我现在遇到了一个新的问题,就是有字符串A是固定值,字符串C包括了字符串B,希望求出字符串C包括A的比率.但是我并没有找到很好的解决方案.于是自己写了一个可用的简单算法 .
算法原理
1.对固定的字符串A进行二元分词.得到一个字符数组.
2.循环得到的数组,如果数组中的某个字符串在C中存在,计数加1
3.计算下一个数组与上一个数组之间的距离做0.7(可根据实际需求调整)的指数距离并加到计数器
4.将计数/数组的长度,得到一个比例.
代码
public static float IncludeStr(string val, string str)
{
//1.将val二远分词
List<string> words = new List<string>();
int i = 0;
while (i < val.Length)
{
int m = 2;
if (i + m >= val.Length)
m = 1;
words.Add(val.Substring(i, m));
i = i + 2;
}
float num = 0;
int wordIndex = -1;
foreach (string s in words)
{
int index = str.IndexOf(s);
if (index >= 0)
{
num = num + 1;
if (wordIndex > 0)
{
num += (float)Math.Pow(0.7, (index - wordIndex - s.Length + 1));
}
wordIndex = index;
}
}
return num / words.Count;
}
2014.6.27日补
在实际的使用过程中发现上面的效果并不是很好,于是用了一个更加简单暴力的方法。
- 循环短的那个字符串,长度为n,循环n次
- 每次取两个字符,一直到最后
- 如果在长的字符串里面能够找到,将变量m加1
-
最后返回m/n的比率
发现这种简单粗暴的方法可以解决80%的问题。
public static float includeStr1(string fname, string name) { int m = 0; for (int i = 0; i < name.Length; i++) { string s; if (i + 1 < name.Length) { s = name.Substring(i, 2); } else { s = name.Substring(i); } if (fname.IndexOf(s) >= 0) { m++; } } return (float)m / (float)name.Length; }