判断化学方程式两边元素种类以及个数是否相等
那么就对左右两边表达式分别处理,存储在map中,两个map可以直接比较大小,得出答案
对于单独一边的表达式,又可以根据加号进行分割成各项
对每一项
首先先剥离出前面的数字系数
然后将后面那一串进行递归处理(因为可能会出现括号嵌套)
将每一项处理后的map进行合并成一个总的map
进行比较
map可以直接用==进行比较是否相等
对于有嵌套的问题,尝试用递归去进行解决
递归的范围仔细考虑,是整个字符串?还是只递归括号内的内容?递归如何结束?
函数使用字符串下标引用的时候千万要注意,越界,出现TLE仔细查看逻辑
#include
#include
#include
#include
using namespace std;
typedef unordered_map <string, int> MPSI;
bool is_num(char c)
{
return c >= '0' && c <= '9';
}
bool is_big(char c)
{
return c >= 'A' && c <= 'Z';
}
bool is_small(char c)
{
return c >= 'a' && c <= 'z';
}
MPSI deal(string str, int &i)
{
MPSI tmp;
for (; i < str.size();)
{
if (is_big(str[i])) //当前字符为大写字母
{
string s1 = "", s2 = "";
s1 += str[i ++]; //i指向大写字母的后一位
while (i < str.size() && is_small(str[i])) s1 += str[i ++]; //若有小写元素,则包含小写元素
int num = 1;
while (i < str.size() && is_num(str[i])) s2 += str[i ++]; //判断元素后是否有数字
if (s2.size()) num = atoi(s2.c_str());
tmp[s1] += num; //将这个元素的个数纳入哈希中,记住是+=, 不是=,因为这个元素可能在这项里出现多次
}
else if (str[i] == '(') //当前字符为(
{
i ++; //过滤掉(
MPSI r = deal(str, i);//递归处理括号内的内容,并且i随着变化,当返回时,str【i】是)
i ++; //过滤掉)
//判断)后是否有数字
int num = 1;
string s = "";
while (i < str.size() && is_num(str[i])) s += str[i ++];
if (s.size()) num = atoi(s.c_str());
for (auto x : r)
{
tmp[x.first] += x.second * num; ///记住这里也是+= ,而不是=
}
}
else if (str[i] == ')') break;
}
return tmp;
}
MPSI work(string str) //根据加号分割每一项进行处理
{
MPSI res;
for (int i = 0; i < str.size(); i ++)
{
int j = i;
while (j < str.size() && str[j] != '+') j ++;
string tmp = str.substr(i, j - i);
int c = 1;
string num = "";
int k = 0;
while (k < tmp.size() && is_num(tmp[k])) num += tmp[k ++];
if (k) c = atoi(num.c_str());
auto t = deal(tmp, k); //返回每一项元素总和的哈希
for (auto x : t)
{
res[x.first] += x.second * c;
//cout << x.first << " " << x.second << endl;
}
//puts("");
i = j;
}
return res;
}
int main()
{
string str;
int n;
cin >> n;
getchar();
while (n --)
{
getline(cin, str);
int t = str.find('='); //根据等号将左右两边分开处理
MPSI res1 = work(str.substr(0, t));
MPSI res2 = work(str.substr(t + 1));
if (res1 == res2) puts("Y");
else puts("N");
}
return 0;
}