昨晚12.10分稍微看了一下题目的意思。感觉这不太像是简单题目的。就是模拟出这个规律比较难,但是看了力扣的题解就发现。如果抽取出题目的意思就会显得比较简单,就是让你模拟出 集合论中的双射
**双射的满足:
**让我们去判断字符串的每一个位置是否能构成一一对应的关系。可能有一点点绕,但是你就算不知道这个知识点,你去硬模拟,到最后还是应该去实现双射这个结论。
双射:既要满足单射又要满足满射。
字母和单词是否一一对应,即相同字母对应相同单词,且不同字母对应不同单词。不同字母对应不同单词,等价于相同单词对应相同字母。
代码如下:
class Solution {
public:
//满射直接对应单词的长度
bool wordPattern(string pattern, string s) {
vector<string> str;
//用流的方式将每一个单词读入当vector当中
stringstream raw(s);
string line;//其实这个方式就像是类似于split的分割函数
unordered_map<char,string> char_to_word;
unordered_map<string,char> word_to_char;
while(raw>>line) str.push_back(line);
if(pattern.size()!=str.size()) return false;
//现在去书写一下双射的关系
for(int i=0;i<pattern.size();i++){
auto a=pattern[i];
auto b=str[i];
if(char_to_word.count(a)&&char_to_word[a]!=b) return false;
char_to_word[a]=b;
if(word_to_char.count(b)&&word_to_char[b]!=a) return false;
word_to_char[b]=a;
}
return true;
}
};
这里需要去注意下c++中没有split的分割函数,所以需要用流读取。stringstream读取,这玩意好像还是蛮有用的,其实《C++ primer》里面有一章节就明确讲到了,在参考287页,里面明确有stringstream的使用。
今天看《jvav性能优化》看到,其实split函数也没有那么好。也还是有点点问题的。多的就不说了,安利看一下那一本书啊。