• 两个字符串“相等”


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

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

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

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

  • 相关阅读:
    [JLOI2015] 管道连接
    【知识点】斯坦纳树
    [ZJOI2010] 网络扩容
    【知识点】网络流常见模型
    [NOI2009] 植物大战僵尸
    [NOI2007] 货币兑换
    【知识点】分治相关算法
    [NOI2005] 月下柠檬树
    [HNOI2012] 射箭
    [SDOI2014] 向量集
  • 原文地址:https://www.cnblogs.com/iois/p/4032095.html
Copyright © 2020-2023  润新知