|
| 1 | +// https://leetcode.com/problems/multiply-strings |
| 2 | +// T: O(|num1| * |num2|) |
| 3 | +// S: O(|num1| + |num2|) |
| 4 | + |
| 5 | +public class MultiplyStrings { |
| 6 | + private static final String ZERO = "0"; |
| 7 | + private static final String ONE = "1"; |
| 8 | + |
| 9 | + public String multiply(String num1, String num2) { |
| 10 | + if (ZERO.equals(num1) || ZERO.equals(num2)) return ZERO; |
| 11 | + if (ONE.equals(num1)) return num2; |
| 12 | + if (ONE.equals(num2)) return num1; |
| 13 | + |
| 14 | + StringBuilder result = new StringBuilder(ZERO); |
| 15 | + for (int i = num2.length() - 1 ; i >= 0 ; i--) { |
| 16 | + result = add(result, multiply(num1, num2.charAt(i) - '0', num2.length() - i - 1)); |
| 17 | + } |
| 18 | + return result.toString(); |
| 19 | + } |
| 20 | + |
| 21 | + private StringBuilder multiply(String number, int digit, int factor) { |
| 22 | + final StringBuilder result = new StringBuilder(); |
| 23 | + int carry = 0; |
| 24 | + for (int i = number.length() - 1 ; i >= 0 ; i--) { |
| 25 | + int val = (number.charAt(i) - '0') * digit + carry; |
| 26 | + result.append(val % 10); |
| 27 | + carry = val / 10; |
| 28 | + } |
| 29 | + if (carry > 0) result.append(carry); |
| 30 | + return result.reverse().append(ZERO.repeat(factor)); |
| 31 | + } |
| 32 | + |
| 33 | + private StringBuilder add(StringBuilder a, StringBuilder b) { |
| 34 | + final StringBuilder result = new StringBuilder(); |
| 35 | + int carry = 0; |
| 36 | + for (int i = a.length() - 1, j = b.length() - 1 ; i >= 0 || j >= 0 ; i--, j--) { |
| 37 | + int val = getDigit(a, i) + getDigit(b, j) + carry; |
| 38 | + result.append(val % 10); |
| 39 | + carry = val / 10; |
| 40 | + } |
| 41 | + if (carry > 0) result.append(carry); |
| 42 | + return result.reverse(); |
| 43 | + } |
| 44 | + |
| 45 | + private int getDigit(StringBuilder string, int index) { |
| 46 | + if (index < 0) return 0; |
| 47 | + return string.charAt(index) - '0'; |
| 48 | + } |
| 49 | +} |
0 commit comments