Every day a leetcode
题目来源:205. 同构字符串
解法1:STL string.find()
我们判断 s 和 t 每个位置上的字符是否都一一对应,即 s 的任意一个字符被 t 中唯一的字符对应,同时 t 的任意一个字符被 s 中唯一的字符对应。
这种对应叫做双射关系。
使用STL string.find()能很好解决这个问题。
代码:
/*
* @lc app=leetcode.cn id=205 lang=cpp
*
* [205] 同构字符串
*/
// @lc code=start
class Solution
{
public:
bool isIsomorphic(string s, string t)
{
if (s.size() != t.size())
return false;
for (int i = 0; i < s.size(); i++)
if (s.find(s[i]) != t.find(t[i]))
return false;
return true;
}
};
// @lc code=end
结果:
复杂度分析:
时间复杂度:O(n),其中n是字符串的长度。
空间复杂度:O(1)。
解法2:哈希
unordered_map 容器,直译过来就是"无序 map 容器"的意思。
所谓“无序”,指的是 unordered_map 容器不会像 map 容器那样对存储的数据进行排序。
换句话说,unordered_map 容器和 map 容器仅有一点不同,即 map 容器中存储的数据是有序的,而 unordered_map 容器中是无序的。
代码:
class Solution
{
public:
bool isIsomorphic(string s, string t)
{
if (s.size() != t.size())
return false;
unordered_map<char, char> smap;
unordered_map<char, char> tmap;
int len = s.size();
for (int i = 0; i < len; i++)
{
if ((smap.find(s[i]) != smap.end() && smap[s[i]] != t[i]) || (tmap.find(t[i]) != tmap.end() && tmap[t[i]] != s[i]))
return false;
smap.insert(pair<char, char>(s[i], t[i]));
tmap.insert(pair<char, char>(t[i], s[i]));
}
return true;
}
};
运行结果:
复杂度分析: