3579. Minimum Steps to Convert String with Operations
Description
You are given two strings, word1
and word2
, of equal length. You need to transform word1
into word2
.
For this, divide word1
into one or more contiguous substrings. For each substring substr
you can perform the following operations:
-
Replace: Replace the character at any one index of
substr
with another lowercase English letter. -
Swap: Swap any two characters in
substr
. -
Reverse Substring: Reverse
substr
.
Each of these counts as one operation and each character of each substring can be used in each type of operation at most once (i.e. no single index may be involved in more than one replace, one swap, or one reverse).
Return the minimum number of operations required to transform word1
into word2
.
Example 1:
Input: word1 = "abcdf", word2 = "dacbe"
Output: 4
Explanation:
Divide word1
into "ab"
, "c"
, and "df"
. The operations are:
- For the substring
"ab"
,- Perform operation of type 3 on
"ab" -> "ba"
. - Perform operation of type 1 on
"ba" -> "da"
.
- Perform operation of type 3 on
- For the substring
"c"
do no operations. - For the substring
"df"
,- Perform operation of type 1 on
"df" -> "bf"
. - Perform operation of type 1 on
"bf" -> "be"
.
- Perform operation of type 1 on
Example 2:
Input: word1 = "abceded", word2 = "baecfef"
Output: 4
Explanation:
Divide word1
into "ab"
, "ce"
, and "ded"
. The operations are:
- For the substring
"ab"
,- Perform operation of type 2 on
"ab" -> "ba"
.
- Perform operation of type 2 on
- For the substring
"ce"
,- Perform operation of type 2 on
"ce" -> "ec"
.
- Perform operation of type 2 on
- For the substring
"ded"
,- Perform operation of type 1 on
"ded" -> "fed"
. - Perform operation of type 1 on
"fed" -> "fef"
.
- Perform operation of type 1 on
Example 3:
Input: word1 = "abcdef", word2 = "fedabc"
Output: 2
Explanation:
Divide word1
into "abcdef"
. The operations are:
- For the substring
"abcdef"
,- Perform operation of type 3 on
"abcdef" -> "fedcba"
. - Perform operation of type 2 on
"fedcba" -> "fedabc"
.
- Perform operation of type 3 on
Constraints:
1 <= word1.length == word2.length <= 100
word1
andword2
consist only of lowercase English letters.
Solutions
Solution 1: Greedy + Dynamic Programming
We define \(f[i]\) as the minimum number of operations required to convert the first \(i\) characters of \(\textit{word1}\) to the first \(i\) characters of \(\textit{word2}\). The answer is \(f[n]\), where \(n\) is the length of both \(\textit{word1}\) and \(\textit{word2}\).
We can compute \(f[i]\) by enumerating all possible split points. For each split point \(j\), we need to calculate the minimum number of operations required to convert \(\textit{word1}[j:i]\) to \(\textit{word2}[j:i]\).
We can use a helper function \(\text{calc}(l, r, \text{rev})\) to compute the minimum number of operations needed to convert \(\textit{word1}[l:r]\) to \(\textit{word2}[l:r]\), where \(\text{rev}\) indicates whether to reverse the substring. Since the result of performing other operations before or after a reversal is the same, we only need to consider not reversing, and reversing once before other operations. Therefore, \(f[i] = \min_{j < i} (f[j] + \min(\text{calc}(j, i-1, \text{false}), 1 + \text{calc}(j, i-1, \text{true})))\).
Next, we need to implement the \(\text{calc}(l, r, \text{rev})\) function. We use a 2D array \(cnt\) to record the pairing status of characters between \(\textit{word1}\) and \(\textit{word2}\). For each character pair \((a, b)\), if \(a \neq b\), we check whether \(cnt[b][a] > 0\). If so, we can pair them and reduce one operation; otherwise, we need to add one operation and increment \(cnt[a][b]\) by \(1\).
The time complexity is \(O(n^3 + |\Sigma|^2)\) and the space complexity is \(O(n + |\Sigma|^2)\), where \(n\) is the length of the string and \(|\Sigma|\) is the size of the character set (which is \(26\) in this problem).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
|