地址:https://leetcode-cn.com/problems/verbal-arithmetic-puzzle/
思路:思维+DFS
一开始我考虑对加分字符串进行DFS,发现写起来很麻烦,后来发现可以将每个出现的字符按照出现的位置将其总值求出来,这样就只需要DFS每个字符所代表的数字了,这样代码就十分清晰明了。同时要注意剪枝和数字无首位0即可。
Code:
class Solution {
public:
int n;
int a[30],aa[30],d1[15],d2[15],bo[15];
bool boo,b[10];
bool isSolvable(vector<string>& words, string result) {
memset(a,0,sizeof(a));
memset(aa,0,sizeof(aa));
memset(d1,0,sizeof(d1));
memset(d2,0,sizeof(d2));
memset(b,0,sizeof(b));
memset(bo,0,sizeof(bo));
n=0;
boo=false;
for(auto si:words)
for(auto c:si)
if(!a[c-'A']) a[c-'A']=++n;
for(auto c:result)
if(!a[c-'A']) a[c-'A']=++n;
for(auto si:words)
{
for(int i=si.length()-1,w=1;i>=0;w*=10,--i)
d1[a[si[i]-'A']]+=w;
bo[a[si[0]-'A']]=1;
}
for(int i=result.length()-1,w=1;i>=0;w*=10,--i)
d2[a[result[i]-'A']]+=w;
bo[a[result[0]-'A']]=1;
DFS(1);
return boo;
}
void DFS(int k){
if(boo) return;
if(k==n+1){
int s1=0,s2=0;
for(int i=1;i<=10;++i)
s1+=aa[i]*d1[i];
for(int i=1;i<=10;++i)
s2+=aa[i]*d2[i];
if(s1==s2) boo=true;
return;
}
for(int i=bo[k];i<=9;++i)
if(!b[i]){
b[i]=true;
aa[k]=i;
DFS(k+1);
b[i]=false;
}
}
};