快速比较两个字符串是否“相等”
两个字符串相等:字符串中的每个字符出现的次数都相等。
“abbcc”与“cbabc”相等,因为两个字符串中‘a’都出现了1次,‘b’出现2次,‘c’出现2次。
其中一种方法是使用散列表,散列表的经典应用是字典,以单词为关键字,其解释为值;
对于本文的问题, 将字符作为关键字, 其出现次数为值。
可以用unordered_map:
#include<iostream> #include<string> #include<unordered_map> using namespace std; bool isEqual(const string &s1,const string &s2){ unordered_map<char,int> hash; int s1_length=s1.length(); int s2_length=s2.length(); if (s1_length != s2_length) return false; for(int i=0;i<=s1_length;++i){ ++hash[s1[i]]; --hash[s2[i]]; } for(auto i=hash.cbegin();i!=hash.cend();++i){ if(i->second!=0) return false; } return true; } int main(){ cout<<isEqual("aabbccd","aabbccd")<<endl; return 1; }
如果字符是标准的ASCII 码的话可以直接用字符的码值作为索引:
#include<iostream> #include<string> using namespace std; bool isEqual(const string &s1,const string &s2){ int hashtable[128]; for(int i=0;i<128;++i){ hashtable[i]=0; } int s1_length=s1.length(); int s2_length=s2.length(); if (s1_length != s2_length) return false; for(int i=0;i<=s1_length;++i){ ++hashtable[s1[i]]; --hashtable[s2[i]]; } for(int i=0;i<128;++i){ if(hashtable[i]!=0) return false; } return true; }
若有错误或纰漏,还望指出。