-
動的計画法(Dynamic Programming)を使用する方法: 動的計画法は、部分問題の結果を利用して最適解を求める手法です。以下は、動的計画法を使用してLCSを求めるJavaのコード例です。
public static String findLCS(String s1, String s2) { int m = s1.length(); int n = s2.length(); int[][] dp = new int[m + 1][n + 1]; for (int i = 0; i <= m; i++) { for (int j = 0; j <= n; j++) { if (i == 0 || j == 0) dp[i][j] = 0; else 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]); } } StringBuilder lcs = new StringBuilder(); int i = m, j = n; while (i > 0 && j > 0) { if (s1.charAt(i - 1) == s2.charAt(j - 1)) { lcs.insert(0, s1.charAt(i - 1)); i--; j--; } else if (dp[i - 1][j] > dp[i][j - 1]) { i--; } else { j--; } } return lcs.toString(); }
-
再帰を使用する方法: 再帰を使用してLCSを求めることもできます。以下は、再帰を使用してLCSを求めるJavaのコード例です。
public static String findLCS(String s1, String s2) { if (s1.isEmpty() || s2.isEmpty()) return ""; char x = s1.charAt(0); char y = s2.charAt(0); String remaining1 = s1.substring(1); String remaining2 = s2.substring(1); if (x == y) return x + findLCS(remaining1, remaining2); else { String lcs1 = findLCS(s1, remaining2); String lcs2 = findLCS(remaining1, s2); return (lcs1.length() > lcs2.length()) ? lcs1 : lcs2; } }
これらはLCSを求めるための基本的な方法です。他にもさまざまなアプローチや最適化手法がありますが、上記のコード例は初学者にも理解しやすく、実用的です。また、長さだけでなく実際のLCS自体を求める方法も提供しています。