【问题标题】:Alignment similar words algorithm [closed]对齐相似词算法
【发布时间】:2018-07-12 10:17:04
【问题描述】:

我会如下对齐两个字符串数组:

| welcome | to | my | home | ___ | _____ | ___| _______ | ____

| _______ | __ | my | home | is  | where | my | parents | live  

我正在使用 java 和 2 个数组列表。你能给我推荐一个现成的算法来完成这项工作吗?

【问题讨论】:

标签: java arrays algorithm


【解决方案1】:

正如评论中提到的@tobias_k,这是一个著名的问题,称为Longest Common Subsequence。下面的解决方案使用动态编程技术来获得更好的性能。您可以找到有关此解决方案的更详细说明here

import java.util.ArrayList;
import java.util.Arrays;

public class LongestCommonSubstring {
    public static ArrayList lcs(ArrayList l1, ArrayList l2) {
        int[][] d = new int[l1.size() + 1][l2.size() + 1];
        for (int i1 = 1; i1 <= l1.size(); i1++) {
            for (int i2 = 1; i2 <= l2.size(); i2++) {
                if (l1.get(i1 - 1).equals(l2.get(i2 - 1))) {
                    d[i1][i2] = d[i1 - 1][i2 - 1] + 1;
                } else {
                    d[i1][i2] = Math.max(d[i1 - 1][i2], d[i1][i2 - 1]);
                }
            }
        }
        int i1 = l1.size(), i2 = l2.size();
        ArrayList result = new ArrayList(Arrays.asList(new String[d[i1][i2]]));
        while (i1 > 0 && i2 > 0) {
            if (l1.get(i1 - 1).equals(l2.get(i2 - 1))) {
                result.set(d[i1][i2] - 1, l1.get(i1 - 1));
                i1 -= 1;
                i2 -= 1;
            } else if (d[i1][i2] == d[i1 - 1][i2]) {
                i1 -= 1;
            } else {
                i2 -= 1;
            }
        }
        return result;
    }

    public static void main(String[] args) {
        ArrayList l1 = new ArrayList(Arrays.asList("welcome to my home".split(" ")));
        ArrayList l2 = new ArrayList(Arrays.asList("my home is where my parents live".split(" ")));
        System.out.println(lcs(l1, l2));
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-21
    • 2011-08-13
    • 2011-09-17
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 2020-12-12
    • 1970-01-01
    相关资源
    最近更新 更多