用户定义字典的字符串比较算法

时间:2013-12-20 19:50:53

标签: java algorithm spell-checking string-comparison levenshtein-distance

在我的项目中,用户输入被转换为[x,x,x,x,x,x,x,x,x,x]形式的字符串,其中x是1到8之间的数字,并存储到此类字符串的库中。稍后我必须将用户的新输入与该库中的每个字符串进行比较。

所以我试图找到提及格式的两个字符串之间的相似性。我尝试了Levenhstein距离算法,但它不适合我的需要。对于字符串[1,8,7,6,5,4,3,2,0,0][1,7,6,5,4,3,2,0,0,0],Levenhstein发现距离为7,而在我看来,距离只有一个。 Levenhstein只编辑每个角色,但不会移动角色。

有人可以根据我之前提到的标准建议另一种拼写检查或字符串比较算法吗?

我使用的Levenshtein算法:

public static int getLevenshteinDistance(String s, String t)
{
   if (s == null || t == null)
   {
      throw new IllegalArgumentException("Strings must not be null");
   }
   int d[][]; // matrix
   int n; // length of s
   int m; // length of t
   int i; // iterates through s
   int j; // iterates through t
   char s_i; // ith character of s
   char t_j; // jth character of t
   int cost; // cost

   // Step 1
   n = s.length();
   m = t.length();
   if (n == 0)
   {
      return m;
   }
   if (m == 0)
   {
      return n;
   }
   d = new int[n + 1][m + 1];

   // Step 2
   for (i = 0; i <= n; i++)
   {
      d[i][0] = i;
   }

   for (j = 0; j <= m; j++)
   {
      d[0][j] = j;
   }

   // Step 3
   for (i = 1; i <= n; i++)
   {
      s_i = s.charAt(i - 1);

      // Step 4
      for (j = 1; j <= m; j++)
      {
         t_j = t.charAt(j - 1);

         // Step 5
         if (s_i == t_j)
         {
            cost = 0;
         }
         else
         {
            cost = 1;
         }

         // Step 6
         d[i][j] = min(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + cost);
      }
   }

   // Step 7
   return d[n][m];
}

0 个答案:

没有答案