Given two strings word1 and word2, return the minimum number of operations required to convert word1 to word2.
You have the following three operations permitted on a word:
Insert a character
Delete a character
Replace a character
주어진 문자열 word1과 word2에 대해서, word1을 word2로 변환하기 위한
최소한의 명령 횟수를 리턴하시오.
문자열에는 세가지의 명령을 내릴수 있습니다.
Input: word1 = "horse", word2 = "ros"
Output: 3
Explanation:
horse -> rorse ('h'를 'r'로 변경)
rorse -> rose ('r' 제거)
rose -> ros ('e' 제거)
여기서 빈 부분을 채워나가는 규칙은 2개가 있습니다.
word1의 맨 뒷부분 문자와 word2의 맨 뒷부분 문자가 같다면 대각선 왼쪽 윗방향에서 그대로 가져오면 됩니다.
앞부분을 바꾸는데 필요한 명령들만 실행하면 어차피 뒷부분은 같기때문에 추가적인 명령이 필요없기 때문입니다.
허나 맨 뒷부분의 문자열이 같지 않다면 다음과 같은 절차를 거칩니다.
이 경우 세가지 경우중 최소의 값을 고르면 됩니다.
이를 모두 완료한 뒤 memoization 배열의 오른쪽 최 하단 부분의 값을 리턴하면 됩니다.
이를 코드로 나타내면 아래와 같습니다.
class Solution:
def minDistance(self, word1: str, word2: str) -> int:
dp = [[0 for _ in range(len(word2)+1)] for _ in range (len(word1)+1)]
dp[0][0] = 0
for i in range(1, len(word1)+1):
dp[i][0] = i
for i in range(1, len(word2)+1):
dp[0][i] = i
for i in range(1, len(word1)+1):
for j in range(1, len(word2)+1):
if word1[i-1] == word2[j-1]: dp[i][j] = dp[i-1][j-1]
else: dp[i][j] = min(dp[i-1][j-1] + 1, dp[i-1][j] + 1, dp[i][j-1] + 1)
return dp[len(word1)][len(word2)]