leetcode 5298
给你一个方程,左边用 words 表示,右边用 result 表示。
你需要根据以下规则检查方程是否可解:
每个字符都会被解码成一位数字(0 - 9)。
每对不同的字符必须映射到不同的数字。
每个 words[i] 和 result 都会被解码成一个没有前导零的数字。
左侧数字之和(words)等于右侧数字(result)。
如果方程可解,返回 True,否则返回 False。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/verbal-arithmetic-puzzle
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路是暴力加剪枝,只想说不要随便用STL,尤其是迭代器
下面代码还是超时
class Solution {
public:
int a[26];
bool vis[26],used[26];
char s[26];
bool Begin[26];
int mp[26];
int ans=0;
int B=0;
void dfs(int step,int k,vector<string>&words,string result)
{
if(ans)
return;
if(step==k)
{
int num=0;
for(int i=0;i<k;i++)
{
mp[s[i]-'A']=a[num++];
}
int len=result.length();
int tmp=0,sum=0,tp=0;
for(int i=0;i<len;i++)
tp=tp*10+mp[result[i]-'A'];
for(int i=0;i<words.size();i++)
{
int l=words[i].size();
tmp=0;
for(int j=0;j<l;j++)
tmp=tmp*10+mp[words[i][j]-'A'];
sum+=tmp;
}
if(tp==sum)
ans=1;
return;
/*int add=0;
int len=result.length();
int stp=1;
int flag=1;
while(1)
{
int tmp=0;
for(int i=0;i<words.size();i++)
{
int l=words[i].size();
if(l>=0&&stp<=l)
{
tmp=tmp+mp[words[i][l-stp]-'A'];
}
tmp+=add;
add=tmp/10;
tmp=tmp%10;
}
if(tmp==0&&add==0)
break;
if(stp<=len&&tmp!=mp[result[len-stp]-'A'])
{
flag=0;
break;
}
stp++;
}
if(flag==1)
ans=1;
return;*/
}
for(int i=0;i<=9;i++)
{
if(!vis[i])
{
if(i==0&&Begin[s[step]-'A']==1)
continue;
a[step]=i;
vis[i]=1;
dfs(step+1,k,words,result);
vis[i]=0;
}
}
}
bool isSolvable(vector<string>& words, string result) {
int p=0;
for(int i=0;i<words.size();i++)
{
Begin[words[i][0]-'A']=1;
int len=words[i].length();
for(int j=0;j<len;j++)
{
if(!used[words[i][j]-'A'])
{
used[words[i][j]-'A']=1;
s[p++]=words[i][j];
}
}
}
int len=result.length();
Begin[result[0]-'A']=1;
for(int i=0;i<len;i++)
{
if(!used[result[i]-'A'])
{
used[result[i]-'A']=1;
s[p++]=result[i];
}
}
dfs(0,p,words,result);
if(ans)
return true;
else
return false;
}
};