赞
踩
事出有因,今天刷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;
}

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。