1.题目
2.题解
package 刷题记录;
import java.util.Scanner;
public class 最长公共子序列_244 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str1 = scanner.nextLine();
String str2 = scanner.nextLine();
char S[] = str1.toCharArray();
char T[] = str2.toCharArray();
//来控制T的索引值
int index = 0;
for (int i = 0; i < S.length; i++) {
//如果S[i] == T[index],T[index]继续往下走,与S[i]继续判断。
if (S[i] == T[index]) index++;
}
System.out.println(index);
}
}
3.总结
就是用index变量来控制T[m]数组的索引值,当S[i] == T[index]时,index++。
4.疑惑
当我看到这道题时,我首先考虑使用动态规划方法求解最长公共子序列。然而,我在测试中发现我的代码没有通过任何一个测试点,这让我感到困惑,并且不知道出了什么问题。
我个人的思路如下,请指教是否存在问题:
4.1例题图解
4.2代码展示
package 刷题记录;
import java.util.Scanner;
public class 最长子序列_未解决 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String S = scanner.next();
String T = scanner.next();
System.out.println(f(S,T));
}
static int f(String str1 , String str2) {
char ch1[] = str1.toCharArray();
char ch2[] = str2.toCharArray();
//1.这是为什么要长度加1呢?
//因为要在c1[0]与c2[0]加一个单位的空子串。
int a[][] = new int[ch1.length+1][ch2.length+1];
//2.为什么是从1开始呢?
//是因为 空子串与任何单位子串 都是0,所以空子串的行和列这两行都是0。
for (int i = 1; i < ch1.length+1; i++) {
for (int j = 1; j < ch2.length+1; j++) {
//3.注意ch1[i-1]和ch2[j-1]的下标是要 -1 的
//当ch1[i-1] == ch2[j-1]时,a[i][j] = a[i-1][j-1] + 1,即左斜上角 + 1;
if (ch1[i-1] == ch2[j-1] ) {
a[i][j] = a[i-1][j-1] + 1;
//4.当ch1[i-1] != ch2[j-1]时,Math.max(a[i-1][j], a[i][j-1]),即取左边或上边的最大值;
}else {
a[i][j] = Math.max(a[i][j-1], a[i-1][j]);
}
}
}
//5.返回二维数组最后一个元素就是最长子序列的长度
return a[ch1.length][ch2.length];
}
}
5.期望
以上是我与你分享的题目,以及我的疑惑。如果你能指点出其中存在的问题或错误,我将不胜感激。谢谢!