最长公共序列(LCS)中的java.lang.OutOfMemoryError

时间:2014-08-16 10:15:34

标签: java

我得到" java.lang.OutOfMemoryError:Java堆空间"我已经阅读了它并发现使用命令行选项-Xmx运行Java可以解决这个问题。但不幸的是,我无法做到这一点,因为这是一个在线判断问题。你们可以建议我减少代码中的堆大小吗?

public static void main(String[] args) throws IOException {

    // Scanner bf = new Scanner(System.in);
    BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
    String x = "a";
    String y = "a";

    for (int i = 0; i < 48000; i++) {
        x = x.concat("a");
        y = y.concat("a");

    }

    if (!x.isEmpty() && !y.isEmpty() && x.matches("\\p{L}+") && y.matches("\\p{L}+") && x.length() <= 50000 && y.length() <= 50000) {
        int i, j;
        int lenx = x.length();
        int leny = y.length();
        System.out.println(x.length() + " " + y.length());
        int[][] table = new int[lenx + 1][leny + 1];

    // Initialize table that will store LCS's of all prefix strings.
        // This initialization is for all empty string cases.
        for (i = 0; i <= lenx; i++) {
            table[i][0] = 0;
        }
        for (i = 0; i <= leny; i++) {
            table[0][i] = 0;
        }

    // Fill in each LCS value in order from top row to bottom row,
        // moving left to right.
        for (i = 1; i <= lenx; i++) {
            for (j = 1; j <= leny; j++) {

                // If last characters of prefixes match, add one to former value.
                if (x.charAt(i - 1) == y.charAt(j - 1)) {
                    table[i][j] = 1 + table[i - 1][j - 1];
                } // Otherwise, take the maximum of the two adjacent cases.
                else {
                    table[i][j] = Math.max(table[i][j - 1], table[i - 1][j]);
                }

            }

        }

        // This is our answer.
        System.out.println(table[lenx][leny]);
    }

    bf.close();

}

字符串x和y的长度不能超过50000。

编辑:我听说稀疏矩阵使用较少的内存你建议我实现它吗?增加堆不是一个选项,因为它太大(50000X50000)

1 个答案:

答案 0 :(得分:0)

将变量x和y的数据类型更改为 StringBuilder ,因为您对这些字符串类型的变量执行了许多连接操作。因此,对于每个连接操作,都会创建一个新的字符串对象,这会导致作为String的OutOfMemory错误是不可变