コンセプト
クラスの複数の配列。
タイトル
- 回文サブシーケンス最長:最長を求めて
- 削除ASCII 712ザ・二つの文字列の最小合計最も値:
- 最大サブアレイ718の繰り返し長さ:最も価値
最長の回文サブシーケンス
方法:再帰+メモ
方法2:再帰+メモ
間隔DP練習
リファレンス
class Solution {
public int longestPalindromeSubseq(String s) {
int len = s.length();
int[][] dp = new int[len][len];
for(int i = len - 1; i >= 0; i --){
dp[i][i] = 1;
for(int j = i + 1; j < len; j ++){
if(s.charAt(i) == s.charAt(j)){
dp[i][j] = dp[i+1][j-1] + 2;
}
else{
dp[i][j] = Math.max(dp[i+1][j], dp[i][j-1]);
}
}
}
return dp[0][len - 1];
}
}
方法3:再帰+メモ
-ビス型配列の練習は、この問題はLCSに変換することができます:単一の文字列の最長の回文配列は、文字列は最長共通部分、元の配列を求めた後、反転しています。
class Solution {
public int longestPalindromeSubseq(String s) {
int len = s.length();
int[][] dp = new int[len+1][len+1];
String r = new StringBuffer(s).reverse().toString();
for(int i = 0; i <= len; i ++){
dp[0][i] = 0;
dp[i][0] = 0;
}
for(int i = 1; i <= len; i ++){
for(int j = 1; j <= len; j ++){
if(s.charAt(i-1) == r.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[len][len];
}
}
712最小ASCII 2つの文字列のために合計を削除します。
この方法の一つ:
class Solution {
public int minimumDeleteSum(String s1, String s2) {
char[] arr1 = s1.toCharArray();
char[] arr2 = s2.toCharArray();
int[][] dp = new int[arr1.length+1][arr2.length+1];
for(int i = 0; i <= arr1.length; i ++){
for(int j = 0; j <= arr2.length; j++){
if(i == 0 && j == 0){
dp[0][0] = 0;
}
else if(i == 0){
dp[i][j] = dp[i][j-1] + arr2[j-1];
}
else if(j == 0){
dp[i][j] = dp[i-1][j] + arr1[i-1];
}
else{
if(arr1[i-1] == arr2[j-1]){
dp[i][j] = dp[i-1][j-1];
}
else{
dp[i][j] = Math.min(dp[i-1][j] + arr1[i-1], dp[i][j-1] + arr2[j-1]);
}
}
}
}
return dp[arr1.length][arr2.length];
}
}
繰り返し部分配列の718最大長
方法の一つ:再帰+メモ
、彼はその理由を慎重に比較して、明確な状態との関係ではないことを、この質問Longest Common Subsequence
class Solution {
public int findLength(int[] A, int[] B) {
int[][] dp = new int[A.length + 1][B.length + 1];
int res = 0;
for(int i = 0; i < A.length; i ++){
for(int j = 0; j < B.length; j ++){
if(A[i] != B[j]){
dp[i+1][j+1] = 0;
}
else{
dp[i+1][j+1] = dp[i][j] + 1;
}
res = Math.max(res, dp[i+1][j+1]);
}
}
return res;
}
}
方法2:暴力的なソリューション
grandyang暴力的な解決策のアイデアは、実際には同じではありません