From 7a398e1c875caa030dc33b723cbedcd88244c87f Mon Sep 17 00:00:00 2001 From: CodersAcademy006 <104912634+CodersAcademy006@users.noreply.github.com> Date: Fri, 9 Aug 2024 12:23:32 +0530 Subject: [PATCH 1/2] Create Solution.java --- .../Solution.java | 112 ++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 solution/1300-1399/1307.Verbal Arithmetic Puzzle/Solution.java diff --git a/solution/1300-1399/1307.Verbal Arithmetic Puzzle/Solution.java b/solution/1300-1399/1307.Verbal Arithmetic Puzzle/Solution.java new file mode 100644 index 0000000000000..11b26c1613107 --- /dev/null +++ b/solution/1300-1399/1307.Verbal Arithmetic Puzzle/Solution.java @@ -0,0 +1,112 @@ +import java.util.HashMap; +import java.util.List; +import java.util.ArrayList; + +public class Solution { + + private boolean isAnyMapping(List words, int row, int col, int bal, + HashMap letToDig, + char[] digToLet, int totalRows, int totalCols) { + // If traversed all columns. + if (col == totalCols) { + return bal == 0; + } + + // At the end of a particular column. + if (row == totalRows) { + return (bal % 10 == 0 && + isAnyMapping(words, 0, col + 1, bal / 10, letToDig, digToLet, totalRows, totalCols)); + } + + String w = words.get(row); + + // If the current string 'w' has no character in the ('col')th index. + if (col >= w.length()) { + return isAnyMapping(words, row + 1, col, bal, letToDig, digToLet, totalRows, totalCols); + } + + // Take the current character in the variable letter. + char letter = w.charAt(w.length() - 1 - col); + + // Create a variable 'sign' to check whether we have to add it or subtract it. + int sign = (row < totalRows - 1) ? 1 : -1; + + // If we have a prior valid mapping, then use that mapping. + // The second condition is for the leading zeros. + if (letToDig.containsKey(letter) && + (letToDig.get(letter) != 0 || (letToDig.get(letter) == 0 && w.length() == 1) || col != w.length() - 1)) { + + return isAnyMapping(words, row + 1, col, bal + sign * letToDig.get(letter), + letToDig, digToLet, totalRows, totalCols); + + } else { + // Choose a new mapping. + for (int i = 0; i < 10; i++) { + // If 'i'th mapping is valid then select it. + if (digToLet[i] == '-' && (i != 0 || (i == 0 && w.length() == 1) || col != w.length() - 1)) { + digToLet[i] = letter; + letToDig.put(letter, i); + + // Call the function again with the new mapping. + if (isAnyMapping(words, row + 1, col, bal + sign * letToDig.get(letter), + letToDig, digToLet, totalRows, totalCols)) { + return true; + } + + // Unselect the mapping. + digToLet[i] = '-'; + letToDig.remove(letter); + } + } + } + + // If nothing is correct then just return false. + return false; + } + + public boolean isSolvable(String[] wordsArr, String result) { + // Add the string 'result' in the list 'words'. + List words = new ArrayList<>(); + for (String word : wordsArr) { + words.add(word); + } + words.add(result); + + int totalRows = words.size(); + + // Find the longest string in the list and set 'totalCols' with the size of that string. + int totalCols = 0; + for (String word : words) { + if (totalCols < word.length()) { + totalCols = word.length(); + } + } + + // Create a HashMap for the letter to digit mapping. + HashMap letToDig = new HashMap<>(); + + // Create a char array for the digit to letter mapping. + char[] digToLet = new char[10]; + for (int i = 0; i < 10; i++) { + digToLet[i] = '-'; + } + + return isAnyMapping(words, 0, 0, 0, letToDig, digToLet, totalRows, totalCols); + } + + public static void main(String[] args) { + Solution sol = new Solution(); + + String[] words1 = {"SEND", "MORE"}; + String result1 = "MONEY"; + System.out.println(sol.isSolvable(words1, result1)); // Output: true + + String[] words2 = {"SIX", "SEVEN", "SEVEN"}; + String result2 = "TWENTY"; + System.out.println(sol.isSolvable(words2, result2)); // Output: true + + String[] words3 = {"LEET", "CODE"}; + String result3 = "POINT"; + System.out.println(sol.isSolvable(words3, result3)); // Output: false + } +} From c04fe0ef19e8f8be8c327aa14213d9a6fb5b5935 Mon Sep 17 00:00:00 2001 From: Libin YANG Date: Tue, 13 Aug 2024 08:21:36 +0800 Subject: [PATCH 2/2] Update Solution.java --- .../Solution.java | 53 ++++++------------- 1 file changed, 17 insertions(+), 36 deletions(-) diff --git a/solution/1300-1399/1307.Verbal Arithmetic Puzzle/Solution.java b/solution/1300-1399/1307.Verbal Arithmetic Puzzle/Solution.java index 11b26c1613107..035c8f1424ef3 100644 --- a/solution/1300-1399/1307.Verbal Arithmetic Puzzle/Solution.java +++ b/solution/1300-1399/1307.Verbal Arithmetic Puzzle/Solution.java @@ -1,12 +1,6 @@ -import java.util.HashMap; -import java.util.List; -import java.util.ArrayList; - -public class Solution { - - private boolean isAnyMapping(List words, int row, int col, int bal, - HashMap letToDig, - char[] digToLet, int totalRows, int totalCols) { +class Solution { + private boolean isAnyMapping(List words, int row, int col, int bal, + HashMap letToDig, char[] digToLet, int totalRows, int totalCols) { // If traversed all columns. if (col == totalCols) { return bal == 0; @@ -14,8 +8,9 @@ private boolean isAnyMapping(List words, int row, int col, int bal, // At the end of a particular column. if (row == totalRows) { - return (bal % 10 == 0 && - isAnyMapping(words, 0, col + 1, bal / 10, letToDig, digToLet, totalRows, totalCols)); + return (bal % 10 == 0 + && isAnyMapping( + words, 0, col + 1, bal / 10, letToDig, digToLet, totalRows, totalCols)); } String w = words.get(row); @@ -33,23 +28,25 @@ private boolean isAnyMapping(List words, int row, int col, int bal, // If we have a prior valid mapping, then use that mapping. // The second condition is for the leading zeros. - if (letToDig.containsKey(letter) && - (letToDig.get(letter) != 0 || (letToDig.get(letter) == 0 && w.length() == 1) || col != w.length() - 1)) { - - return isAnyMapping(words, row + 1, col, bal + sign * letToDig.get(letter), - letToDig, digToLet, totalRows, totalCols); + if (letToDig.containsKey(letter) + && (letToDig.get(letter) != 0 || (letToDig.get(letter) == 0 && w.length() == 1) + || col != w.length() - 1)) { + + return isAnyMapping(words, row + 1, col, bal + sign * letToDig.get(letter), letToDig, + digToLet, totalRows, totalCols); } else { // Choose a new mapping. for (int i = 0; i < 10; i++) { // If 'i'th mapping is valid then select it. - if (digToLet[i] == '-' && (i != 0 || (i == 0 && w.length() == 1) || col != w.length() - 1)) { + if (digToLet[i] == '-' + && (i != 0 || (i == 0 && w.length() == 1) || col != w.length() - 1)) { digToLet[i] = letter; letToDig.put(letter, i); - + // Call the function again with the new mapping. - if (isAnyMapping(words, row + 1, col, bal + sign * letToDig.get(letter), - letToDig, digToLet, totalRows, totalCols)) { + if (isAnyMapping(words, row + 1, col, bal + sign * letToDig.get(letter), + letToDig, digToLet, totalRows, totalCols)) { return true; } @@ -93,20 +90,4 @@ public boolean isSolvable(String[] wordsArr, String result) { return isAnyMapping(words, 0, 0, 0, letToDig, digToLet, totalRows, totalCols); } - - public static void main(String[] args) { - Solution sol = new Solution(); - - String[] words1 = {"SEND", "MORE"}; - String result1 = "MONEY"; - System.out.println(sol.isSolvable(words1, result1)); // Output: true - - String[] words2 = {"SIX", "SEVEN", "SEVEN"}; - String result2 = "TWENTY"; - System.out.println(sol.isSolvable(words2, result2)); // Output: true - - String[] words3 = {"LEET", "CODE"}; - String result3 = "POINT"; - System.out.println(sol.isSolvable(words3, result3)); // Output: false - } }