ποΈ Problems
Minimum Insertion Steps to Make a String Palindrome - LeetCode
Given a string s. In one step you can insert any character at any index of the string.
Return the minimum number of steps to make s palindrome.
A Palindrome String is one that reads the same backward as well as forward.
Input: s = "zzazz"
Output: 0
Explanation: The string "zzazz" is already palindrome we do not need any insertions.
β¨ Idea
dp[i][j]
:s[i,...,j]
substring μ palindrome λ§λ€κΈ° μν΄μ νμν μ΅μ insertion νμ.- μ΅μ’
λ΅ :
dp[0][N-1]
- μ΅μ’
λ΅ :
- basecase : i, jκ° λμΌν κ²½μ°μΈ
dp[i][j]
μ κ²½μ°μλ λ¨μΌ μΊλ¦ν°μ΄λ―λ‘ νμ λμΌνλ―λ‘ insertion νμλ 0. - μν μ μ΄ λ°©μ μ:
s[i]
μs[j]
λΉκ΅νμ¬- λμΌν λ : 맨 μΈλΆκ° λμΌνλ―λ‘ λ΄λΆ
dp[i+1][j-1]
λ³κ²½νμμ λμΌν¨. - λ€λ₯Ό λ : νμͺ½λ§ ν¬ν¨ν κ²½μ°μμ ν λ² insertion ν κ² λΉκ΅ν΄μ minimum
- λμΌν λ : 맨 μΈλΆκ° λμΌνλ―λ‘ λ΄λΆ
π Intuition
DP : κ²°μ , μν, μν μ μ΄ λ°©μ μ
- κ²°μ : i,j string κ°μ μΌμΉ μ 무
- μν :
dp[i][j]
λs[i,...,j]
μ insertionμ ν΅ν palindrome λ§λ€ μ μλ μ΅μκ°. - μν μ μ΄ λ°©μ μ
if (s[i] === s[j]) {
dp[i][j] = dp[i + 1][j - 1];
} else {
dp[i][j] = Math.min(1 + dp[i + 1][j], 1 + dp[i][j - 1]);
}
πΈοΈ π‘ dynamic programming μμ μν λ°©ν₯μ κ²°μ μ μ΄λ»κ² ?
Dynamic programming λ¬Έμ λ₯Ό 보면 μ΄λ¨λλ 0 -> N
μΌλ‘ μνλ₯Ό νκ³ , μ΄λ¨λλ N ->0
μΌλ‘ μννλ λ± λ€μνμλλ° μλ λ΄μ©μ μκ² λμ΄ μ 리ν΄λ΄
λλ€.
μν μ μ΄ λ°©μ μμ΄ κ³μ°μ΄ λκΈ° μν΄μλ λ€μμ λ§μ‘±ν΄μΌ νλ€.
- μμ λ¬Έμ
dp[i][j]
κ³μ°μ μνμ¬ μ΄λ―Έ κ³μ°λ νμ λ¬Έμ μ κ²°κ³Όλ₯Ό μ°Έμ‘°νκ² λ©λλ€.- μ΄μ κ°
dp[i-1][j-1]
μ μ°Έμ‘°νκΈ°λ νκ³ - palindromeμ κ²½μ°μλ λ΄λΆ string μ κ²°κ³Όλ₯Ό μ°Έμ‘°ν΄μΌνλ―λ‘
dp[i+1][j-1]
κ°μ μ°Έμ‘°ν΄μΌν¨.
- μ΄μ κ°
- μν μ μ΄ λ°©μ μ κ³μ° 맨 λ§μ§λ§μ μ΅μ’
κ²°κ³Όκ° λμΆλμ΄ ν¨.
- μνμ μ μμ λ°λΌμ μ΅μ’ κ°μ΄ λ¬λΌμ§.
- μ΄λ€ κ²½μ°μλ
dp[N-1][N-1]
- μ΄λ² κ²½μ°μλ
string[0, N-1]
μ²μλΆν° λκΉμ§ ꡬμ±λ κ²½μ°μ μ΅μ insertion νμκ° νμνλ―λ‘ μ΅μ’ κ°μdp[0][N-1]
μ΄λ κ² μν μ μ΄ λ°©μ μ κ³μ° κ³Όμ μμ μ΄μ κ°μ΄ κ³μ°μ΄ λμ΄μΌ νκ³ , κ·Έ κ³Όμ μ λ§μ§λ§μ μ΅μ’ λ΅μ΄ λμΆλλλ‘ μν λ°©ν₯μ κ²°μ ν©λλ€.
μ΄λ² λ¬Έμ μ κ²½μ°
- basecase i,j κ° κ°μ κ²½μ°μλ 0μΌλ‘ μ΄κΈ°κ°.
dp[i][j]
κ³μ° μ λ€μ μΈκ°μ κ°μ΄ νμν¨.dp[i+1][j-1]
dp[i+1][j]
dp[i]][j-1]
μ΄ κ³μ°μ μν΄μλ λ€μκ³Ό κ°μ΄ μλ°©ν₯μΌλ‘ μμ§μ΄λ©΄ κ°λ₯νλ€.
- row λ₯Ό
[N-2, ..., 0]
- col μ
[row + 1, ..., N-1]
for (let i = N -2; i >= 0; i -= 1) {
for (let j = i + 1; j < N; j += 1) {
...
}
}
π₯ My Solution
/**
* @param {string} s
* @return {number}
*/
var minInsertions = function (s) {
const N = s.length;
const dp = Array(N)
.fill(null)
.map((_) => Array(N).fill(0));
for (let i = N - 2; i >= 0; i -= 1) {
for (let j = i + 1; j < N; j += 1) {
if (s[i] === s[j]) {
dp[i][j] = dp[i + 1][j - 1];
} else {
dp[i][j] = Math.min(1 + dp[i + 1][j], 1 + dp[i][j - 1]);
}
}
}
return dp[0][N - 1];
};