文章目錄
題目描述
思路 & 代碼
- 注意:dp[i]][j] 和 charAt(i) 有1的下標差(dp初始化邊界)
- 核心思想:當前值可構成新的最大子串就左上角值 + 1,否則取左邊與上邊的最大值。
- tips:眾所周知 Java 字符串換 charArray 效率會提高
class Solution {public int longestCommonSubsequence(String text1
, String text2
) {int m
= text1
.length();int n
= text2
.length();int[][] dp
= new int[m
+ 1][n
+ 1];for(int i
= 1; i
<= m
; i
++){for(int j
= 1; j
<= n
; j
++){if(text1
.charAt(i
- 1) == text2
.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]);}}}return dp
[m
][n
];}
}
二刷
class Solution {public int longestCommonSubsequence(String text1
, String text2
) {int m
= text1
.length();int n
= text2
.length();int[][] dp
= new int[m
+ 1][n
+ 1];for(int i
= 0; i
< m
; i
++) {for(int j
= 0; j
< n
; j
++) {if(text1
.charAt(i
) == text2
.charAt(j
)) {dp
[i
+ 1][j
+ 1] = dp
[i
][j
] + 1;}else {dp
[i
+ 1][j
+ 1] = Math.max(dp
[i
+ 1][j
], dp
[i
][j
+ 1]);}}}return dp
[m
][n
];}
}
三刷
class Solution {public int longestCommonSubsequence(String text1
, String text2
) {int[][] dp
= new int[text1
.length() + 1][text2
.length() + 1];for(int i
= 1; i
<= text1
.length(); i
++) {for(int j
= 1; j
<= text2
.length(); j
++) {if(text1
.charAt(i
- 1) == text2
.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]);}}return dp
[text1
.length()][text2
.length()];}
}
總結
以上是生活随笔為你收集整理的【LeetCode笔记】1143. 最长公共子序列(Java、动态规划、字符串)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。