Java 自定义字典的字符串比较算法

Java 自定义字典的字符串比较算法,java,algorithm,spell-checking,string-comparison,levenshtein-distance,Java,Algorithm,Spell Checking,String Comparison,Levenshtein Distance,在我的项目中,用户输入被转换为[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],Levenhstein发现距离为7,而在我看来,距离只有一个。列文斯坦只编辑每个字符,但不移动字符 有人能推荐另一种拼写检查

在我的项目中,用户输入被转换为
[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]
,Levenhstein发现距离为7,而在我看来,距离只有一个。列文斯坦只编辑每个字符,但不移动字符

有人能推荐另一种拼写检查或字符串比较算法与我前面提到的标准吗

我使用的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];
}
public static int getlevenshteindication(字符串s,字符串t)
{
如果(s==null | | t==null)
{
抛出新的IllegalArgumentException(“字符串不能为null”);
}
int d[][];//矩阵
int n;//s的长度
int m;//t的长度
int i;//遍历s
int j;//遍历t
char s_i;//s的第i个字符
char t_j;//t的第j个字符
int cost;//成本
//第一步
n=s.长度();
m=t.长度();
如果(n==0)
{
返回m;
}
如果(m==0)
{
返回n;
}
d=新整数[n+1][m+1];
//步骤2

对于(i=0;i Levenhstein距离包括插入和删除,所以它应该是有效的。也许我使用的算法的旧版本不支持这一点。我正在用我使用的代码更新这个问题。它是
2
,而不是
1
,因为在一个末尾有3个0,但在另一个末尾有2个-你必须这样做如果您希望忽略尾随的0,则要明确满足此要求。对于算法建议部分,请参阅此问题-我在将[x,x,x,x,x,x]转换为“xxxxxxxxx”时得到了正确的结果