为了账号安全,请及时绑定邮箱和手机立即绑定

将String改为StringBuilder,程序就会出错?

将String改为StringBuilder,程序就会出错?

慕妹3146593 2019-01-17 20:41:46
目标:打印出给定字符串的所有的最长公共子序列。 示例:第一行:acb,第二行abc;输出结果:ac,ab 正确程序: import java.util.HashSet; import java.util.Scanner; import java.util.Set; public class LCS { private static int[][] dp; private static String s1, s2; private final static Set<String> set = new HashSet<>(); public static void main(String[] args) { Scanner in = new Scanner(System.in); s1 = in.nextLine(); int len1 = s1.length(); s2 = in.nextLine(); int len2 = s2.length(); //dp结果计算 dp = new int[len1+1][len2+1]; for (int i = 1; i < len1+1; i++) { for (int j = 1; j < len2+1; j++) { if (s1.charAt(i-1) == s2.charAt(j-1)) { dp[i][j] = dp[i-1][j-1] + 1; } else { dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]); } } } //打印dp结果 for (int i = 0; i < len1+1; i++) { for (int j = 0; j < len2+1; j++) { System.out.print(dp[i][j] + " "); } System.out.println(); } //输出所有的LCS String res = ""; traceBack(len1, len2, res); System.out.println(set.toString()); } private static void traceBack(int len1, int len2, String res) { while (len1 > 0 && len2 > 0) { if (s1.charAt(len1-1) == s2.charAt(len2-1)) { res += s1.charAt(len1-1); //res.append(s1.charAt(len1-1)); len1--; len2--; } else { if (dp[len1][len2-1] > dp[len1-1][len2]) { len2--; } else if (dp[len1][len2-1] < dp[len1-1][len2]) { len1--; } else { traceBack(len1-1, len2, res); traceBack(len1, len2-1, res); return; } } } set.add(new StringBuilder(res).reverse().toString()); } } 错误代码,求大佬指点: 示例:第一行:acb,第二行abc;输出结果:ac,abac,求解哪里出问题了?谢谢 import java.util.HashSet; import java.util.Scanner; import java.util.Set; /** * 问题:利用StringBuilder代替String就会有问题 */ public class LCS { private static int[][] dp; private static String s1, s2; private final static Set<String> set = new HashSet<>(); public static void main(String[] args) { Scanner in = new Scanner(System.in); s1 = in.nextLine(); int len1 = s1.length(); s2 = in.nextLine(); int len2 = s2.length(); //dp结果计算 dp = new int[len1+1][len2+1]; for (int i = 1; i < len1+1; i++) { for (int j = 1; j < len2+1; j++) { if (s1.charAt(i-1) == s2.charAt(j-1)) { dp[i][j] = dp[i-1][j-1] + 1; } else { dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]); } } } for (int i = 0; i < len1+1; i++) { for (int j = 0; j < len2+1; j++) { System.out.print(dp[i][j] + " "); } System.out.println(); } //输出所有的LCS StringBuilder res = new StringBuilder(); traceBack(len1, len2, res); System.out.println(set.toString()); } private static void traceBack(int len1, int len2, StringBuilder res) { while (len1 > 0 && len2 > 0) { if (s1.charAt(len1-1) == s2.charAt(len2-1)) { res.append(s1.charAt(len1-1)); len1--; len2--; } else { if (dp[len1][len2-1] > dp[len1-1][len2]) { len2--; } else if (dp[len1][len2-1] < dp[len1-1][len2]) { len1--; } else { traceBack(len1-1, len2, res); traceBack(len1, len2-1, res); return; } } } set.add(new StringBuilder(res).reverse().toString()); } }
查看完整描述

1 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

traceBack(len1-1, len2, res);
traceBack(len1, len2-1, res);

执行第一行后res会发生改变。

查看完整回答
反对 回复 2019-02-12
  • 1 回答
  • 0 关注
  • 462 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号