Given an equation, represented by words
on the left side and the result
on the right side.
You need to check if the equation is solvable under the following rules:
words[i]
and result
are decoded as one number without leading zeros.words
) will equal to the number on the right side (result
).Return true
if the equation is solvable, otherwise return false
.
Example 1:
Input: words = ["SEND","MORE"], result = "MONEY" Output: true Explanation: Map 'S'-> 9, 'E'->5, 'N'->6, 'D'->7, 'M'->1, 'O'->0, 'R'->8, 'Y'->'2' Such that: "SEND" + "MORE" = "MONEY" , 9567 + 1085 = 10652
Example 2:
Input: words = ["SIX","SEVEN","SEVEN"], result = "TWENTY" Output: true Explanation: Map 'S'-> 6, 'I'->5, 'X'->0, 'E'->8, 'V'->7, 'N'->2, 'T'->1, 'W'->'3', 'Y'->4 Such that: "SIX" + "SEVEN" + "SEVEN" = "TWENTY" , 650 + 68782 + 68782 = 138214
Example 3:
Input: words = ["LEET","CODE"], result = "POINT" Output: false Explanation: There is no possible mapping to satisfy the equation, so we return false. Note that two different characters cannot map to the same digit.
Constraints:
2 <= words.length <= 5
1 <= words[i].length, result.length <= 7
words[i], result
contain only uppercase English letters.10
.This problem requires finding a valid mapping of letters to digits such that the sum of numbers represented by the words in the words
array equals the number represented by the result
string. The solution uses a backtracking approach with recursive function calls to explore all possible mappings.
Algorithm:
Preprocessing:
result
string is added to the words
array to treat it as part of the equation.Recursive Function isAnyMapping
: This function is the core of the backtracking algorithm.
words
array, current row
(string index), col
(digit index), running balance
(bal
), letter-to-digit mapping (letToDig
), digit-to-letter mapping (digToLet
), total number of rows, and total number of columns as input.col == totalCols
), the function checks if the final balance is 0. If yes, a valid mapping is found.row == totalRows
), it checks if the balance is divisible by 10 (no carry-over) and recursively calls itself for the next column.words[row]
) in the current column.letToDig
(and it's a valid mapping avoiding leading zeros), the function recursively calls itself with the existing mapping.letToDig
and digToLet
.true
, a solution is found, and the function returns true
.false
, the mapping is undone (backtracking).false
.isSolvable
Function:
letToDig
and digToLet
mappings.isAnyMapping
function to start the backtracking process.Time Complexity: O(10^N), where N is the number of unique letters in the input. In the worst case, we might try all 10 possible digits for each unique letter. This is an upper bound, and the actual runtime might be significantly shorter due to backtracking and early pruning.
Space Complexity: O(N), primarily due to the letter-to-digit and digit-to-letter mapping structures.
Code Improvements:
The provided code is generally well-structured. However, some minor improvements could enhance readability and efficiency:
letToDig
and digToLet
are already quite clear, but using even more explicit names, like letterToDigitMap
and digitToLetterMap
, would enhance readability.