zoukankan      html  css  js  c++  java
  • 两个字符串“相等”

    快速比较两个字符串是否“相等”

    两个字符串相等:字符串中的每个字符出现的次数都相等。

    “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;
    }

    若有错误或纰漏,还望指出。

  • 相关阅读:
    Luogu P4071 [SDOI2016]排列计数
    CF 961E Tufurama
    Luogu P2057 [SHOI2007]善意的投票
    Luogu P2756 飞行员配对方案问题
    POJ2151
    POJ 3349&&3274&&2151&&1840&&2002&&2503
    POJ 2388&&2299
    EZ 2018 03 30 NOIP2018 模拟赛(六)
    POJ 1459&&3436
    BZOJ 1001: [BeiJing2006]狼抓兔子
  • 原文地址:https://www.cnblogs.com/iois/p/4032095.html
Copyright © 2011-2022 走看看