Easy to understand recursive/DP solution, beats 99.6%
```\npublic class Solution {\n    int[][] dp;\n    \n    public int minDistance(String word1, String word2) {\n\tdp = new int[word1.length()][word2.length()];\n
```\npublic class Solution {\n    int[][] dp;\n    \n    public int minDistance(String word1, String word2) {\n\tdp = new int[word1.length()][word2.length()];\n\t    \n        return minDistanceHelper(word1, word2, 0, 0);\n    }\n    \n    private int minDistanceHelper(String word1, String word2, int index1, int index2) {\n        if (index1 == word1.length()) return word2.length() - index2;\n        if (index2 == word2.length()) return word1.length() - index1;\n\t    \n\tif (dp[index1][index2] > 0) return dp[index1][index2];\n        \n        int result;\n        if (word1.charAt(index1) == word2.charAt(index2)) {\n            result = minDistanceHelper(word1, word2, index1+1, index2+1);\n        } else {\n            // replace char\n            result = 1 + minDistanceHelper(word1, word2, index1+1, index2+1);\n            \n            // delete char from word1\n            result = Math.min(result, 1 + minDistanceHelper(word1, word2, index1+1, index2));\n            \n            // delete char from word2\n            result = Math.min(result, 1 + minDistanceHelper(word1, word2, index1, index2+1));\n        }\n        \n\tdp[index1][index2] = result;\n\treturn result;\n    }\n}
['Dynamic Programming', 'Recursion', 'Java']