STL map find_if

事出有因,今天刷leetcode的时候需要用到用一个map来记录每一个字母出现的下标映射。(Isomorphic Strings)
一开始考虑使用了:

 map< char, vector<int> >

但是会遇到一个问题,就是map在存储元素的时候会自动调整内部的顺序,导致最后存储的字母的顺序变化,映射匹配的时候出错。

所以只能使用

vector< char, vector<int> >

但是这样的一个问题是没办法使用find(beg,end,val)去查找对应的char。
主要是自己对于find_if不熟悉,不会写find_if的判断函数

class vector_finder{
public:
    vector_finder(const char ch):_ch(ch){}

    bool operator ()(const vector< pair< char,vector<int> > > ::value_type &value){
        return value.first==_ch;
    }
    private:
        char  _ch;                 
 };
    auto it1=find_if(charIdxMap1.begin(),charIdxMap1.end(),vector_finder(s[i]));

使用find_if的时候需要一个xxx_finder class ,通过构造函数来初始化要查询匹配的value,然后重载 operator () 来实现在find_if中的调用。
注意重载函数的返回类型必须是bool类型.

说道这里,把自己的解决方法也给出来吧。


bool isIsomorphic(string s, string t) {
     vector<pair< char,vector<int> > >  charIdxMap1; //字母及索引映射表,第一个元素存字母,第二个存下标
     vector<pair< char,vector<int> > > charIdxMap2;

    for(size_t i=0;i<s.size();++i){
        auto it1=find_if(charIdxMap1.begin(),charIdxMap1.end(),vector_finder(s[i]));
        auto it2=find_if(charIdxMap2.begin(),charIdxMap2.end(),vector_finder(t[i]));
        if(it1==charIdxMap1.end()){//如果是新的元素,插入
            vector<int> ivec(1,i);
            charIdxMap1.push_back(make_pair(s[i],ivec));
        }
        else{//如果不是新的元素
            (*it1).second.push_back(i);
        }

        if(it2==charIdxMap2.end()){//如果是新的元素,插入
            vector<int> ivec(1,i);
            charIdxMap2.push_back(make_pair(t[i],ivec));
        }
        else{//如果不是新的元素
            (*it2).second.push_back(i);
        }
    }

    auto it1=charIdxMap1.begin();
    auto it2=charIdxMap2.begin();

    //遍历映射表
    for(;it1!=charIdxMap1.end(),it2!=charIdxMap2.end();it1++,it2++){
        if(  (*it1).second.size() != (*it2).second.size() ){
            return false;
        }
        else{
            for(size_t j=0;j<(*it1).second.size();++j){
                int temp1=(*it1).second.at(j);
                int temp2=(*it2).second.at(j);

                if( temp1 != temp2){
                    return false;
                }
            }
        }
    }
    return true;

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值