如何在java中实现字符串的近似匹配?

如何在java中实现字符串的近似匹配?,java,string,comparison,string-matching,lcs,Java,String,Comparison,String Matching,Lcs,各位程序员好 我想就弦的近匹配寻求一些帮助 目前,我有一个存储描述字符串的程序,用户可以通过完全或部分输入来搜索描述 我想实现一个近似匹配搜索。例如,实际描述为“hello world”,但用户错误地输入了搜索“hello eorld”。程序应该能够向用户返回“hello world” 我已经尝试查看模式和匹配来实现它,但它需要一个正则表达式来匹配字符串,因此我的描述没有规则模式。我也尝试过string.contains,但它似乎也不起作用。下面是我试图实现的代码的一部分 ArrayLi

各位程序员好

我想就弦的近匹配寻求一些帮助

目前,我有一个存储描述字符串的程序,用户可以通过完全或部分输入来搜索描述

我想实现一个近似匹配搜索。例如,实际描述为“hello world”,但用户错误地输入了搜索“hello eorld”。程序应该能够向用户返回“hello world”

我已经尝试查看模式和匹配来实现它,但它需要一个正则表达式来匹配字符串,因此我的描述没有规则模式。我也尝试过string.contains,但它似乎也不起作用。下面是我试图实现的代码的一部分

    ArrayList <String> list = new ArrayList<String>();
    list.add("hello world");
    list.add("go jogging at london");
    list.add("go fly kite");
    Scanner scan = new Scanner(System.in);

    for(int i = 0; i < list.size(); i++){
      if(list.get(i).contains(scan.next())) {
         System.out.println(list.get(i));
      }
    }
ArrayList list=new ArrayList();
添加(“你好世界”);
添加(“在伦敦慢跑”);
添加(“放飞风筝”);
扫描仪扫描=新扫描仪(System.in);
对于(int i=0;i
其他程序员能帮我解决这个问题吗???

你可以使用LCS(最长公共子序列)看看这些:

公共类LCS{
公共静态void main(字符串[]args){
字符串x=StdIn.readString();
字符串y=StdIn.readString();
int M=x.length();
int N=y.长度();
//opt[i][j]=x[i..M]和y[j..N]的LCS长度
int[][]opt=新int[M+1][N+1];
//通过动态规划计算LCS和所有子问题的长度
对于(int i=M-1;i>=0;i--){
对于(int j=N-1;j>=0;j--){
如果(x.charAt(i)=y.charAt(j))
opt[i][j]=opt[i+1][j+1]+1;
其他的
opt[i][j]=Math.max(opt[i+1][j],opt[i][j+1]);
}
}
//恢复LCS本身并将其打印到标准输出
int i=0,j=0;
而(i=opt[i][j+1])i++;
else-j++;
}
System.out.println();
}
}
其他解决方案如下所示:

对于此问题可能有用。Apache Commons Lang为此提供了一个实现。
此外,如果您想了解字符串之间的差异,StringUtils中的
difference
方法可能会很有趣。

能够限定两个字符串之间的差异

下面是一个实现:

公共类levenshteindication{
私有静态最小整数(整数a、整数b、整数c){
返回Math.min(Math.min(a,b),c);
}
公共静态int ComputeLevenShteIndication(
字符序列str1,
字符序列(str2)
{
int[][]距离=新int[str1.length()+1][str2.length()+1];

对于(int i=0;i我刚开始键入:-)关于您的实现:我将添加一些空字符串测试。如果str1为空,则距离为str2.length()(反之亦然),虽然我不知道该方法如何工作,但我将继续查看它并找到实现它的方法。谢谢SjB:D
public class LCS {

    public static void main(String[] args) {
        String x = StdIn.readString();
        String y = StdIn.readString();
        int M = x.length();
        int N = y.length();

        // opt[i][j] = length of LCS of x[i..M] and y[j..N]
        int[][] opt = new int[M+1][N+1];

        // compute length of LCS and all subproblems via dynamic programming
        for (int i = M-1; i >= 0; i--) {
            for (int j = N-1; j >= 0; j--) {
                if (x.charAt(i) == y.charAt(j))
                    opt[i][j] = opt[i+1][j+1] + 1;
                else 
                    opt[i][j] = Math.max(opt[i+1][j], opt[i][j+1]);
            }
        }

        // recover LCS itself and print it to standard output
        int i = 0, j = 0;
        while(i < M && j < N) {
            if (x.charAt(i) == y.charAt(j)) {
                System.out.print(x.charAt(i));
                i++;
                j++;
            }
            else if (opt[i+1][j] >= opt[i][j+1]) i++;
            else                                 j++;
        }
        System.out.println();

    }

}
public class LevenshteinDistance {
   private static int minimum(int a, int b, int c) {
      return Math.min(Math.min(a, b), c);
   }

   public static int computeLevenshteinDistance(
      CharSequence str1,
      CharSequence str2 )
   {
      int[][] distance = new int[str1.length() + 1][str2.length() + 1];

      for (int i = 0; i <= str1.length(); i++)
         distance[i][0] = i;
      for (int j = 1; j <= str2.length(); j++)
         distance[0][j] = j;

      for (int i = 1; i <= str1.length(); i++)
         for (int j = 1; j <= str2.length(); j++)
            distance[i][j] =
               minimum(
                  distance[i - 1][j] + 1,
                  distance[i][j - 1] + 1,
                  distance[i - 1][j - 1] +
                     ((str1.charAt(i - 1) == str2.charAt(j - 1)) ? 0 : 1));

      return distance[str1.length()][str2.length()];
   }
}