---
# System prepended metadata

title: 0043. Multiply Strings
tags: [Leetcode, FaceBook, Medium]

---

# 0043. Multiply Strings
###### tags: `Leetcode` `FaceBook` `Medium`
Link: https://leetcode.com/problems/multiply-strings/
## 思路 O(M* N) O(M+N)
参考了[这篇](https://leetcode.com/problems/multiply-strings/discuss/17605/Easiest-JAVA-Solution-with-Graph-Explanation)
简单来说第i位和第j位乘法的结果一定是在答案的i+j和i+j+1位

这个思路用了很多小trick，非常值得学习~
- 一个M位的数和一个N位的数乘，长度最长就是M+N
- 因为是从后面往前算的，并且如果第i+j+1位之前有值，会把第i位和第j位乘法的结果加在上面一起算，所以避免了overflow
- 另外遇到例如9999 * 0的情况，ans里面会变成00000，这时候如果不经过处理，返回的string就会是00000，处理的方法是**如果sb现在是空的，那么就不能把0放进去**
## Code
```java=
class Solution {
    public String multiply(String num1, String num2) {
        int m = num1.length();
        int n = num2.length();
        int[] ans = new int[m+n];
        for(int i = m-1; i >= 0; i--){
            for(int j = n-1; j >= 0; j--){
                int n1 = num1.charAt(i)-'0';
                int n2 = num2.charAt(j)-'0';
                int mul = n1*n2;
                int p1 = i+j;
                int p2 = i+j+1;
                mul += ans[p2];
                ans[p1] += mul/10;
                ans[p2] = mul%10;
            }
        }
        StringBuilder sb = new StringBuilder();
        for(int i = 0;i < ans.length;i++){
            if(!(sb.length()==0 && ans[i]==0)){
                sb.append(ans[i]);
            }
        }
        return sb.length()==0?"0":sb.toString();
    }
}
```