鄙人不才,此中鄙陋甚多,望海涵!!!
基本思路:利用哈希表存储字符串的种类和数量,难点在于处理嵌套括号的递归做法!详细见代码!
C++Code
#include<iostream>
#include<cstring>
#include<vector>
#include<unordered_map>
using namespace std;
vector<unordered_map<string, int>> box(2);//可以检测数量的unordered_map
int isupper(char c)
{
if(c>='A' && c<='Z') return 1;
return 0;
}
int islower(char c)
{
if(c>='a' && c<='z') return 1;
return 0;
}
int isnum(char c)
{
if(c>='0' && c<='9') return 1;
return 0;
}
//str是每次要处理的元素,de区分 = 左右,m为元素前系数,level为括号的系数
void oneword(string str,int de,int m,int level)
{
int multi=0,i=0,layer=0,multi1,first,second;
//处理系数;
if(isnum(str[0]))
for(i=0;i<str.size() && isnum(str[i]);i++) multi=multi*10+str[i]-'0';
else multi=1;//元素前的系数
multi*=m;
while(i<str.size())
{
//判断是否为大写字母
if(isupper(str[i]))
{
string temp1;
temp1+=str[i];
multi1=0;
i++;//处理大写字母后的系数或者处理带小写的元素
for ( ;i<str.size() && (islower(str[i]) || isnum(str[i]));i++)
{
if(islower(str[i])) temp1+=str[i];
if(isnum(str[i])) multi1=multi1*10+str[i]-'0';//元素本身系数
}
if(!multi1) multi1 = 1;
box[de][temp1]+=multi1*multi*level;//记录处理处理的元素的数量
}
if(str[i]=='(')
{
layer++;
first=i;
i++;
for( ;i<str.size();i++)
{
if(str[i]=='(') layer++;
if(str[i]==')') layer--;
if(!layer)
{
int multi2=0;//括号系数
second=i;
i++;
for( ;i<str.size()&&isnum(str[i]);i++) multi2=10*multi2+str[i]-'0';
if(!multi2) multi2=1;
oneword(string(str.begin()+first+1,str.begin()+second)\
,de,multi,multi2*level);
break;
}
}
}
}
return;
}
int main()
{
int n;
cin>>n;
while(n--)
{
int flag=0;
string temp,temp0;
box[0].clear();
box[1].clear();
cin>>temp;
for(int i=0;i<temp.size();i++)
{
if(temp[i]=='+')
{
oneword(temp0,flag,1,1);
temp0.clear();
continue;
}
if(temp[i]=='=')
{
oneword(temp0,flag,1,1);
flag=1;
temp0.clear();
continue;
}
temp0+=temp[i];
if(i==temp.size()-1) oneword(temp0,flag,1,1);
}
if(box[0].size()==box[1].size())
{
int flag2=1;
for(auto i:box[0]) if(box[0][i.first]!=box[1][i.first]) flag2=0;
if(flag2) puts("Y");
else puts("N");
}
else puts("N");
}
return 0;
}
创作不易,如果您觉得对您有帮助,就点个赞支持一下!您的赞就是我持续更新优质题解的动力!