Leetcode Java Minimum ASCII Delete Sum for Two Strings
업데이트:
문제
코드
class Solution {
public int minimumDeleteSum(String s1, String s2) {
int s1Length = s1.length();
int s2Length = s2.length();
char[] s1CharArray = s1.toCharArray();
char[] s2CharArray = s2.toCharArray();
int s1Sum = 0;
int s2Sum = 0;
int[][] dp = new int[s1Length + 1][s2Length + 1];
for (int i = 0; i < s1Length; i++) {
s1Sum += s1CharArray[i];
for (int j = 0; j < s2Length; j++) {
if (i == 0) {
s2Sum += s2CharArray[j];
}
dp[i + 1][j + 1] = s1CharArray[i] == s2CharArray[j] ? dp[i][j] + s1CharArray[i] : Math.max(dp[i][j + 1], dp[i + 1][j]);
}
}
return s1Sum + s2Sum - (2 * dp[s1Length][s2Length]);
}
}
결과
설명
-
문자열 s1과 s2이 같아지기 위해 삭제한 문자의 ASCII 코드의 합이 가장 작은 결과를 구하는 문제이다.
- 문제 풀이에 필요한 변수를 정의한다.
- s1Length와 s2Length는 s1과 s2의 길이를 각각 저장한 변수이다.
- s1CharArray와 s2CharArray는 s1과 s2를 문자 배열로 각각 변환하여 저장한 변수이다.
- s1Sum과 s2Sum은 s1과 s2 각각 모든 문자의 ASCII 코드 합을 저장할 변수로 둘 다 0으로 초기화한다.
- dp는 s1과 s2가 같은 문자의 ASCII 코드 합이 가장 큰 값을 구할 변수로, [$s1Length + 1$][$s2Length + 1$] 크기의 2차원 정수 배열로 초기화 한다.
- 0부터 s1Length까지 i를 증가시키며 아래를 수행한다.
- s1Sum에 s1CharArray의 i번쨰 값을 더해 s1의 모든 문자 ASCII 코드 합을 저장한다.
- 0부터 s2Length까지 j를 증가시키며 아래를 수행한다.
- i가 0인 경우, s2Sum에 s2CharArray의 j번째 값을 더해 s2의 모든 문자 ASCII 코드 합을 저장한다.
- s1CharArray의 i번째 문자와 s2CharArray의 j번째 문자가 동일한 경우, dp[$i + 1$][$j + 1$]에 dp[i][j]의 값에 공통된 문자의 ASCII 코드 값을 더한 값을 저장한다.
- 위의 경우가 아니라면, dp[$i + 1$][$j + 1$]에 dp[i][$j + 1$]의 값과 dp[$i + 1$][j]의 값 중 큰 값을 넣어준다.
- 반복이 완료되면 s1Sum과 s2Sum의 합인 모든 문자의 ASCII 코드 값의 합에 s1과 s2의 공통된 문자의 ASCII 코드 값이 최대인 dp[s1Length][s2Length]값의 2배를 뺀 값을 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기