计算两个字符串之间是否包含的简单方法

在前面介绍了两个字符串之间的匹配度 的算法

计算字符串相似度算法—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日补

在实际的使用过程中发现上面的效果并不是很好,于是用了一个更加简单暴力的方法。

  1. 循环短的那个字符串,长度为n,循环n次
  2. 每次取两个字符,一直到最后
  3. 如果在长的字符串里面能够找到,将变量m加1
  4. 最后返回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; 
      }