Java字符对齐算法

met*_*aon 8 java algorithm

我有两个100个字符的数组(最大,可能更小或不同的大小),我想对齐.当有一个与另一个不同的角色时,我想添加一个" - ".我发现了基于动态编程的Needleman-Wunsch算法,以及Smith-Waterman算法,它也是一种基于动态编程的通用局部对齐方法,但它们似乎对我想做的事情太复杂了.我只需要一个简单的Java算法,可能只有不到50行,这段代码将被翻译成汇编语言,这就是为什么我需要一个简单的算法.

有没有办法用diff算法进行这种对齐?如果有,有人可以指出我该怎么做?我搜索了biostar部分,但似乎我需要使用我提到的两种算法.

英语不是我的母语,所以我很想搜索错误的关键词.

我的程序已经使用了Needleman算法和大约200(ish)行代码.

所需输入/输出的示例:

Input
Array 1 : MKNLASREVNIYVNGKLV
Array 2 : QMASREVNIYVNGKL


Output
Array 1 (or a simple print) : -MKNLASREVNIYVNGKLV 
Array 2 (or a simple print) : QM---ASREVNIYVNGKL-
Run Code Online (Sandbox Code Playgroud)

谢谢

Jua*_*pes 10

使用Levenshtein距离的变化,完全符合您的要求:

产量

-MKNLASREVNIYVNGKLV
QM---ASREVNIYVNGKL-
Run Code Online (Sandbox Code Playgroud)

码:

public class Main {
    public static void main(String[] args) {
        String[] aligned = align("MKNLASREVNIYVNGKLV", "QMASREVNIYVNGKL");
        System.out.println(aligned[0]);
        System.out.println(aligned[1]);
    }

    public static String[] align(String a, String b) {
        int[][] T = new int[a.length() + 1][b.length() + 1];

        for (int i = 0; i <= a.length(); i++)
            T[i][0] = i;

        for (int i = 0; i <= b.length(); i++)
            T[0][i] = i;

        for (int i = 1; i <= a.length(); i++) {
            for (int j = 1; j <= b.length(); j++) {
                if (a.charAt(i - 1) == b.charAt(j - 1))
                    T[i][j] = T[i - 1][j - 1];
                else
                    T[i][j] = Math.min(T[i - 1][j], T[i][j - 1]) + 1;
            }
        }

        StringBuilder aa = new StringBuilder(), bb = new StringBuilder();

        for (int i = a.length(), j = b.length(); i > 0 || j > 0; ) {
            if (i > 0 && T[i][j] == T[i - 1][j] + 1) {
                aa.append(a.charAt(--i));
                bb.append("-");
            } else if (j > 0 && T[i][j] == T[i][j - 1] + 1) {
                bb.append(b.charAt(--j));
                aa.append("-");
            } else if (i > 0 && j > 0 && T[i][j] == T[i - 1][j - 1]) {
                aa.append(a.charAt(--i));
                bb.append(b.charAt(--j));
            }
        }

        return new String[]{aa.reverse().toString(), bb.reverse().toString()};
    }
}
Run Code Online (Sandbox Code Playgroud)