持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情
一、题目描述:
205. 同构字符串 - 力扣(LeetCode) (leetcode-cn.com)
给定两个字符串 s 和 t ,判断它们是否是同构的。
如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。
每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。
示例 1:
输入:s = "egg", t = "add"
输出:true
示例 2:
输入:s = "foo", t = "bar"
输出:false
示例 3:
输入:s = "paper", t = "title"
输出:true
提示:
- 1 <= s.length <= 5 * 10^4
- t.length == s.length
- s 和 t 由任意有效的 ASCII 字符组成
二、思路分析:
看到题目朴素的想法是,在循环中维护两个哈希表分别储存当前位置的每个字符上一次出现的位置,当且仅当上次出现的位置总相同时,两个字符串同构。
证明如下:
当字符串长度为1时,两字符串总同构;当字符串长度为2时,若两串上一次出现的位置均为0(用0表示未出现,位置从1开始计数。),则同构,而若上次出现的位置均为1,显然也同构。假设前n-1个字符同构,(必要性)若前n个字符同构,可知第n个字符互相映射,则它们上一次出现位置相同;(充分性)若第n个字符上次出现的位置相同,由于前n-1个字符同构,上次出现的位置上两个字符互相映射,即第n个字符互相映射,故前n个字符同构。
三、AC 代码:
class Solution {
public:
bool isIsomorphic(string s, string t) {
int len=s.size();
unordered_map<char,int> s1,s2;
for(int i=0;i<len;++i){
if(s1[s[i]]!=s2[t[i]])
return false;
s1[s[i]]=i+1;
s2[t[i]]=i+1;
}
return true;
}
};