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

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值