我得到" 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)
答案 0 :(得分:0)
将变量x和y的数据类型更改为 StringBuilder ,因为您对这些字符串类型的变量执行了许多连接操作。因此,对于每个连接操作,都会创建一个新的字符串对象,这会导致作为String的OutOfMemory错误是不可变。