LeetCode-第 169 场周赛-5298. 口算难题

LeetCode-第 169 场周赛-5298. 口算难题_第1张图片

LeetCode-第 169 场周赛-5298. 口算难题_第2张图片

 地址: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& 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;
			}
	}
};

 

你可能感兴趣的:(LeetCode,搜索)