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;
}
};
运行结果:

复杂度分析:

文章介绍了两种解法来判断两个字符串是否为同构字符串。解法1利用STL中的string.find()函数,检查字符串中字符的对应关系。解法2采用哈希表unordered_map,存储字符映射关系,确保对应位置的字符一致。两种方法的时间复杂度均为O(n),空间复杂度分别为O(1)和O(n)。
569

被折叠的 条评论
为什么被折叠?



