# 1307. Verbal Arithmetic Puzzle
###### tags: `Leetcode` `Hard` `Backtracking`
Link: https://github.com/wisdompeak/LeetCode/tree/master/DFS/1307.Verbal-Arithmetic-Puzzle
## 思路
一位一位先后往前处理
参考[思路](https://github.com/wisdompeak/LeetCode/tree/master/DFS/1307.Verbal-Arithmetic-Puzzle)
当同一位数字处理完之后,我们需要检查他们的sum是否与result对应位的数字一致
我们需要考虑剪枝的情况:
1. result对应位的字母已经匹配过数字了 和sum%10不一样
2. result对应位的字母没有匹配数字 但是sum%10已经匹配给别人了
同时我们要检查不能让0成为任何一个字符串的首字母对应的数字
## Code
```java=
class Solution {
int[] map = new int[26];
boolean[] used = new boolean[10];
public boolean isSolvable(String[] words, String result) {
Arrays.fill(map, -1);
for(String word:words) if(word.length()>result.length()) return false;
return dfs(0, 0, 0, words, result);
}
private boolean dfs(int i, int j, int sum, String[] words, String result){
//j 表示已经处理到result的倒数第几位(因为是加法所以每个字符串都要从前往后看)
//i 表示已经处理到哪个word了
if(j==result.length()){
//已经处理完result的最后一位
if(sum!=0) return false;
if(result.length()>1 && map[result.charAt(0)-'A']==0) return false;
return true;
}
int resSZ = result.length();
if(i==words.length){
//对于第j位来说我们已经遍历完了所有的word 所以我们要看现在sum能不能和result的对应位匹配上
if(map[result.charAt(resSZ-j-1)-'A']!=-1){
// 剪枝的第一种情况
if(map[result.charAt(resSZ-j-1)-'A']==sum%10){
return dfs(0, j+1, sum/10, words, result);
}
return false;
}
else{
// 剪枝的第二种情况
if(used[sum%10]) return false;
map[result.charAt(resSZ-j-1)-'A']=sum%10;
used[sum%10] = true;
if(dfs(0, j+1, sum/10, words, result)) return true;
map[result.charAt(resSZ-j-1)-'A']=-1;
used[sum%10] = false;
return false;
}
}
//我们要看words[i]的倒数第j位 但words[i]根本没有倒数第j位
if(j>=words[i].length()) return dfs(i+1, j, sum, words, result);
//尝试给words[i]的倒数第j位放一个数字
int size = words[i].length();
char ch = words[i].charAt(size-j-1);
if(map[ch-'A']!=-1){
if(size>1 && size-j-1==0 && map[ch-'A']==0) return false;
return dfs(i+1, j, sum+map[ch-'A'], words, result);
}
else{
for (int d=0; d<=9; d++){
if (used[d])
continue;
if (d==0 && words[i].length()>1 && j==words[i].length()-1)
continue;
map[ch-'A'] = d;
used[d] = true;
if (dfs(i+1, j, sum+d, words, result))
return true;
map[ch-'A'] = -1;
used[d] = false;
}
return false;
}
}
}
```