-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathLCS.java
111 lines (105 loc) · 3.22 KB
/
LCS.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
public class LCS {
// public static String LCS (String str1, String str2) {
//
// if (str1 == null || str2 ==null|| str1.equals("")||str2.equals("")){
// return "";
// }
// char[] chs1 = str1.toCharArray();
// char[] chs2 = str2.toCharArray();
// int[][] dp = getdp(chs1,chs2);
// int end = 0;
// int max = 0;
// for (int i = 0; i < chs1.length; i++) {
// for (int j = 0; j < chs2.length; j++) {
// if (dp[i][j]>max){
// end = i;
// max = dp[i][j];
// }
// }
// }
// return str1.substring(end-max+1,end+1);
// }
//
// public static int[][] getdp(char[] str1,char[] str2){
// int m = str1.length;
// int n = str2.length;
// int[][] dp = new int[m][n];
// /*先考虑 边界条件*/
// /*动态规划递推公式*/
// /*dp数组取出结果*/
//
// for (int i = 0; i < str1.length; i++) {
// if (str1[i] == str2[0]){
// dp[i][0] = 1;
// }
// }
//
// for (int j = 1; j < str2.length; j++) {
// if (str1[0] == str2[j]){
// dp[0][j] = 1;
// }
// }
// /*str1[i] 不等于 str2[j]时, str1[i] str2[j] 说明在必须把str[i] 和str[j] 当坐公共子串最后一个字符是不可能的 , 领 dp[i][j] = 0 */
// for (int i = 1; i < str1.length; i++) {
// for (int j = 1; j < str2.length; j++) {
// if (str1[i] == str2[j]){
// dp[i][j] = dp[i-1][j-1]+1;
// }
// }
// }
// return dp;
// }
public static void main(String[] args) {
String str1 = "1AB2345CD";
String str2 = "12345EF";
System.out.println(LCS(str1,str2));
}
public static String LCS (String str1, String str2) {
if(str1==null||str2==null||str1.equals("")||str2.equals("")){
return "";
}
char[] arr1 = str1.toCharArray();
char[] arr2 = str2.toCharArray();
int[][] dp = getdp(arr1,arr2);
int max = 0;
int end = 0;
int m = arr1.length;
int n = arr2.length;
for(int i = 0;i<m;i++){
for(int j=0;j<n;j++){
// 找到最大值 更新 max end
if(dp[i][j]>max){
end = i;
max = dp[i][j];
}
}
}
return str1.substring(end-max+1,end+1);
// write code here
}
public static int[][] getdp(char[] arr1,char[] arr2){
int m = arr1.length;
int n = arr2.length;
int[][] dp = new int[m][n];
for(int i = 0;i<m;i++){
if(arr1[i] == arr2[0]){
dp[i][0] = 1;
}
}
for(int j = 1;j<n;j++){
if(arr1[0] == arr2[j]){
dp[0][j] = 1;
}
}
for(int i = 1;i<m;i++){
for(int j = 1;j<n;j++){
if(arr1[i] == arr2[j]){
dp[i][j] = dp[i-1][j-1]+1;
}else {
dp[i][j] = 0;
}
}
}
return dp;
}
}