给你一个字符串word。如果word中同时出现某个字母c的小写形式和大写形式并且每个小写形式的c都出现在第一个大写形式的c之前则称字母c是一个特殊字母。返回word中特殊字母的数量。示例 1:输入word aaAbcBC输出3解释特殊字母是a、b和c。示例 2:输入word abc输出0解释word中不存在特殊字母。示例 3:输入word AbBCab输出0解释word中不存在特殊字母。提示1 word.length 2 * 10^5word仅由小写和大写英文字母组成。分析从左到右扫描字符串记录每个字母当前的状态。lowwer[i]表示在出现大写字母之前已经遇到过多少个对应的小写字母。upper[i]表示对应的大写字母出现次数不过这份代码中它对最终判断没有实际影响只是进行了记录。flag[i]表示当前字母是否已经出现过大写形式。ans表示目前暂时满足条件的特殊字母数量。setintst用来记录后来被判定为不合法的字母。扫描字符串时分两种情况讨论。如果当前字符是大写字母例如A先计算它对应的下标。如果这个字母之前还没有出现过大写形式并且之前已经出现过小写形式说明它暂时满足“小写在前大写在后”的条件因此答案加一然后将flag[val]置为1表示这个字母的大写形式已经出现过。如果当前字符是小写字母例如a同样先计算下标。此时需要判断这个小写字母是不是出现在了对应大写字母之后。如果flag[val]为真说明之前已经出现过对应的大写字母。此时如果lowwer[val]也为真说明这个字母原本已经被计入答案但是现在又在大写字母后面出现了小写字母违反了题目要求所以要把这个字母加入st表示它应该从答案中扣除st.insert(val);如果flag[val]为真但是lowwer[val]为假说明是先出现了大写字母后出现了小写字母。这种情况本来就不会被计入ans因此直接跳过即可。如果flag[val]为假说明目前还没有出现过对应的大写字母那么这个小写字母是合法出现在前面的记录下来。最后ans中记录的是曾经满足“小写在前大写在后”的字母数量而st中记录的是后来又出现小写字母、因此变得不合法的字母数量。所以最终答案为ans - st.size();class Solution { public: int numberOfSpecialChars(string word) { int nword.length(),lowwer[30]{0},upper[30]{0},flag[30]{0},ans0; setintst; for(int i0;in;i) { if(word[i]Aword[i]Z) { int valword[i]-A; upper[val]; if(!flag[val]lowwer[val])flag[val]1,ans; flag[val]1; } else if(word[i]aword[i]z) { int valword[i]-a; if(flag[val]lowwer[val])st.insert(val); else if(flag[val])continue; else lowwer[val]; } } return ans-st.size(); } };