数据结构与算法之同构字符串

开发 前端 算法
每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。

[[441407]]

 同构字符串

力扣题目链接:https://leetcode-cn.com/problems/isomorphic-strings

给定两个字符串 s 和 t,判断它们是否是同构的。

如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。

每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。

示例 1:

  • 输入:s = "egg", t = "add"
  • 输出:true

示例 2:

  • 输入:s = "foo", t = "bar"
  • 输出:false

示例 3:

  • 输入:s = "paper", t = "title"
  • 输出:true

提示:可以假设 s 和 t 长度相同。

思路

字符串没有说都是小写字母之类的,所以用数组不合适了,用map来做映射。

使用两个map 保存 s[i] 到 t[j] 和 t[j] 到 s[i] 的映射关系,如果发现对应不上,立刻返回 false

C++代码 如下:

  1. class Solution { 
  2. public
  3.     bool isIsomorphic(string s, string t) { 
  4.         unordered_map<charchar> map1; 
  5.         unordered_map<charchar> map2; 
  6.         for (int i = 0, j = 0; i < s.size(); i++, j++) { 
  7.             if (map1.find(s[i]) == map1.end()) { // map1保存s[i] 到 t[j]的映射 
  8.                 map1[s[i]] = t[j]; 
  9.             } 
  10.             if (map2.find(t[j]) == map2.end()) { // map2保存t[j] 到 s[i]的映射 
  11.                 map2[t[j]] = s[i]; 
  12.             } 
  13.             // 发现映射 对应不上,立刻返回false 
  14.             if (map1[s[i]] != t[j] || map2[t[j]] != s[i]) { 
  15.                 return false
  16.             } 
  17.         } 
  18.         return true
  19.     } 
  20. }; 

其他语言版本

Java

  1. class Solution { 
  2.     public boolean isIsomorphic(String s, String t) { 
  3.         Map<CharacterCharacter> map1 = new HashMap<>(); 
  4.         Map<CharacterCharacter> map2 = new HashMap<>(); 
  5.         for (int i = 0, j = 0; i < s.length(); i++, j++) { 
  6.             if (!map1.containsKey(s.charAt(i))) { 
  7.                 map1.put(s.charAt(i), t.charAt(j)); // map1保存 s[i] 到 t[j]的映射 
  8.             } 
  9.             if (!map2.containsKey(t.charAt(j))) { 
  10.                 map2.put(t.charAt(j), s.charAt(i)); // map2保存 t[j] 到 s[i]的映射 
  11.             } 
  12.             // 无法映射,返回 false 
  13.             if (map1.get(s.charAt(i)) != t.charAt(j) || map2.get(t.charAt(j)) != s.charAt(i)) { 
  14.                 return false
  15.             } 
  16.         } 
  17.         return true
  18.     } 

Python

  1. class Solution: 
  2.     def isIsomorphic(self, s: str, t: str) -> bool: 
  3.         default_dict1 = defaultdict(str) 
  4.         default_dict2 = defaultdict(str) 
  5.  
  6.         if len(s) != len(t): return false 
  7.  
  8.         for i in range(len(s)): 
  9.             if not default_dict1[s[i]]: 
  10.                 default_dict1[s[i]] = t[i] 
  11.  
  12.             if not default_dict2[t[i]]: 
  13.                 default_dict2[t[i]] = s[i] 
  14.  
  15.             if default_dict1[s[i]] != t[i] or default_dict2[t[i]] != s[i]: 
  16.                 return False 
  17.  
  18.         return True 

Go

  1. func isIsomorphic(s string, t string) bool { 
  2.  map1 := make(map[byte]byte) 
  3.  map2 := make(map[byte]byte) 
  4.  for i := range s { 
  5.   if _, ok := map1[s[i]]; !ok { 
  6.    map1[s[i]] = t[i] // map1保存 s[i] 到 t[j]的映射 
  7.   } 
  8.   if _, ok := map2[t[i]]; !ok { 
  9.    map2[t[i]] = s[i] // map2保存 t[i] 到 s[j]的映射 
  10.   } 
  11.   // 无法映射,返回 false 
  12.   if (map1[s[i]] != t[i]) || (map2[t[i]] != s[i]) { 
  13.    return false 
  14.   } 
  15.  } 
  16.  return true 

JavaScript

  1. var isIsomorphic = function(s, t) { 
  2.     let len = s.length; 
  3.     if(len === 0) return true
  4.     let maps = new Map(); 
  5.     let mapt = new Map(); 
  6.     for(let i = 0, j = 0; i < len; i++, j++){ 
  7.         if(!maps.has(s[i])){ 
  8.             maps.set(s[i],t[j]);// maps保存 s[i] 到 t[j]的映射 
  9.         } 
  10.         if(!mapt.has(t[j])){ 
  11.             mapt.set(t[j],s[i]);// mapt保存 t[j] 到 s[i]的映射 
  12.         } 
  13.         // 无法映射,返回 false 
  14.         if(maps.get(s[i]) !== t[j] || mapt.get(t[j]) !== s[i]){ 
  15.             return false
  16.         } 
  17.     }; 
  18.     return true
  19. }; 

 

责任编辑:姜华 来源: 代码随想录
相关推荐

2021-12-24 11:59:47

数据结构算法字符串

2021-12-23 14:09:43

数据结构算法字符串

2019-03-07 15:43:22

Redis数据SDS

2023-10-19 15:11:48

Redis

2020-12-31 05:31:01

数据结构算法

2020-10-30 09:56:59

Trie树之美

2022-09-21 07:57:33

二叉搜索树排序二叉树

2022-09-26 07:56:53

AVL算法二叉树

2020-10-21 14:57:04

数据结构算法图形

2023-03-08 08:03:09

数据结构算法归并排序

2020-10-12 11:48:31

算法与数据结构

2020-10-20 08:14:08

算法与数据结构

2023-10-27 07:04:20

2022-01-18 19:13:52

背包问题数据结构算法

2009-08-11 14:51:11

C#数据结构与算法

2021-07-16 04:57:45

Go算法结构

2009-08-11 14:43:42

C#数据结构与算法

2021-12-10 11:27:59

数据结构算法单调递增的数字

2021-12-08 11:31:43

数据结构算法合并区间

2023-03-02 08:15:13

点赞
收藏

51CTO技术栈公众号