思路:
代码里用了两个map,m和n,
每次取出一个字符串,然后逐位取出字符,在m里面找是否已经存在第i个字符的key值,如果不存在,就添加到map中,如果已经存在则判断它的value值是否和当前pattern[i]的值是否相等,一旦出现不相等,则立刻可以判断这个字符串不符合要求
但是如果仅仅使用上述条件是不行的(可以试着把关于n的全部注释掉,你会发现在示例中"abc"也会被判断成立),所以n就用来保存pattern中不同种类的字符,如果该字符串符合要求,那么m.size() == n.size()
#include<iostream>
#include<string>
#include<vector>
#include<map>
using namespace std;
class Solution
{
public:
vector<string> findAndReplacePattern(vector<string>& words, string pattern)
{
vector<string> result;
map<char,char> m;
map<char,int> n;
map<char,char>::iterator it;
int length = pattern.size();
int flag = 0;
for(int c = 0; c<words.size(); c++)
{
m.clear();
n.clear();
string str = words[c];
if(str.size() == length)
{
flag = 1;
for(int i = 0; i<str.size(); i++)
{
it = m.find(str[i]);
n[pattern[i]]++;
if(it!=m.end())
{
if(it->second != pattern[i])
{
flag=0;
break;
}
}
else
m.insert(pair<char,char>(str[i],pattern[i]));
}
if(flag==1 && m.size()==n.size())
result.push_back(str);
}
}
return result;
}
};
int main()
{
Solution s;
string pattern = "abb";
vector<string> strVector;
vector<string> result;
strVector.push_back("abc");
strVector.push_back("deq");
strVector.push_back("mee");
strVector.push_back("aqq");
strVector.push_back("dkd");
strVector.push_back("ccc");
vector<string>::iterator it;
// for(it = strVector.begin(); it!=strVector.end(); it++)
// {
// cout<<*it<<endl;
// }
result = s.findAndReplacePattern(strVector,pattern);
for(it = result.begin(); it!=result.end(); it++)
{
cout<<"result:"<<*it<<endl;
}
return 0;
}
学到新方法(感谢不知名大佬)
思路:
每次取出一个字符串str,逐个取出第i个字符,那么以str[i]和pattern[i]的ASCII码分别作为m和n数组的下标,如果是完全匹配,那么两个数组相应位置上的数值应该是一样的,否则那就不符合要求
注意:
m[str[i]]=i+1;
n[pattern[i]]=i+1;
这个地方每次累加的数字应该是个相对特殊的值,不能是仅仅+1,否则示例中的dkd是可以通过的
class Solution
{
public:
vector<string> findAndReplacePattern(vector<string>& words, string pattern)
{
vector<string> result;
int flag;
for(int c=0; c<words.size(); c++)
{
int m[256]={0};
int n[256]={0};
flag = 1;
string str = words[c];
for(int i=0;i<str.size();i++)
{
if(m[str[i]]!=n[pattern[i]])
{
flag = 0;
break;
}
m[str[i]]=i+1;
n[pattern[i]]=i+1;
}
if(flag==1)
result.push_back(str);
}
return result;
}
};