目录
选择题
1.
访问节点一般是用下标访问,所以是 O(1),增加节点考虑的是最坏的情况,在数组的头部增加节点,需要往后挪动元素。
2.
编程题
1. 公共子串计算
代码实现:
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextLine()) { // 注意 while 处理多个 case
String a = in.nextLine();
String b = in.nextLine();
int ret = 0;
if (a.length() > b.length()) {
ret = getStr(b, a);
} else {
ret = getStr(a, b);
}
System.out.println(ret);
}
}
// 假设 a 是短串,b 为长串
public static int getStr(String a, String b) {
// 可以用动态规划来做
int la = a.length();
int lb = b.length();
// a 和 b 的最长公共子串长度
int maxLen = 0;
int ia = -1;// 记录结束下标
int ib = -1;
// 多初始化是为了避免越界
int[][] dp = new int[la + 1][lb + 1];
for (int i = 1; i <= la; i++) {
for (int j = 1; j <= lb; j++) {
char ca = a.charAt(i - 1);
char cb = b.charAt(j - 1);
// 如果 a 的 i 下标字符 和 b 的 j 下标字符相同,则更新
if (ca == cb) {
dp[i][j] = dp[i - 1][j - 1] + 1;
// 更新 maxLen
if (dp[i][j] > maxLen) {
ia = i;
ib = j;
maxLen = dp[i][j];
}
}
}
}
return maxLen;
}
}