290. 单词规律 205. 同构字符串
给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。
这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。
示例1:
输入: pattern = “abba”, str = “dog cat cat dog”
输出: true
示例 2:
输入:pattern = “abba”, str = “dog cat cat fish”
输出: false
示例 3:
输入: pattern = “aaaa”, str = “dog cat cat dog”
输出: false
给定两个字符串 s 和 t ,判断它们是否是同构的。
如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。
每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。
示例 1:
输入:s = “egg”, t = “add”
输出:true
示例 2:
输入:s = “foo”, t = “bar”
输出:false
示例 3:
输入:s = “paper”, t = “title”
输出:true
思路:使用两张哈希表来检测互相是否对应,对于290题,额外开辟一个字符串数组,将字符串中每个单词进行记录。
代码:
290:
class Solution {
public:
bool wordPattern(string pattern, string s) {
int blank=0;
for(int i=0;i<s.size();i++){
if(s[i]==' ')blank++;
}
if(blank+1!=pattern.size())return false;
unordered_map<char,string> h1;
unordered_map<string,char> h2;
vector<string> t(pattern.size());
int j=0;
for(int i=0;i<pattern.size();i++){
for(;j<s.size()&&s[j]!=' ';j++){
t[i].push_back(s[j]);
}
j++;
}
for(int i=0;i<pattern.size();i++){
if(h1.find(pattern[i])!=h1.end()){
if(h1[pattern[i]]!=t[i])return false;
}
h1[pattern[i]]=t[i];
}
for(int i=0;i<pattern.size();i++){
if(h2.find(t[i])!=h2.end()){
if(h2[t[i]]!=pattern[i])return false;
}
h2[t[i]]=pattern[i];
}
return true;
}
};
205:
class Solution {
public:
bool isIsomorphic(string s, string t) {
if(s.size()!=t.size())return false;
unordered_map<char,char> h;
for(int i=0;i<s.size();i++){
if(h.find(s[i])!=h.end()){
if(h[s[i]]!=t[i])return false;
}
h[s[i]]=t[i];
}
unordered_map<char,char> h1;
for(int i=0;i<s.size();i++){
if(h1.find(t[i])!=h1.end()){
if(h1[t[i]]!=s[i])return false;
}
h1[t[i]]=s[i];
}
return true;
}
};