当前位置: 首页 > news >正文

每日算法题 17---205.同构字符串

题目

205.同构字符串

要求

给定两个字符串st,判断它们是否是同构的。如果s中的字符可以按某种映射关系替换得到t,那么这两个字符串是同构的。每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。

示例

示例 1:

输入:s = "egg", t = "add"

输出:true

解释:

字符串st可以通过以下方式变得相同:将'e'映射为'a'。将'g'映射为'd'

示例 2:

输入:s = "f11", t = "b23"

输出:false

解释:

字符串st无法变得相同,因为'1'需要同时映射到'2''3'

思路1(哈希表)

通过题意可知,我们需要判断每个位置上的字符是否都一一对应,即 s 的任意一个字符和 t 中唯一的字符对应,同时 t 的任意一个字符被s中的唯一字符对应(一一映射)

我们想到用两个哈希表来实现,第一张哈希表 s2t 以 s 中字符为键,映射到 t 对应的字符为值,相反第二章哈希表 t2s 以 t 对应的字符为键,映射到 s 对应的字符为值。从左到右遍历两个字符串的字符,不断更新两张哈希表,如果出现不一致情况(例如:s中一个字符对应t中两个字符),就说明两个字符串无法同构;如果遍历完没有发生冲突,那么说明两个字符串同构

代码1

class Solution { public boolean isIsomorphic(String s, String t) { Map<Character, Character> s2t = new HashMap<Character, Character>(); Map<Character, Character> t2s = new HashMap<Character, Character>(); int len = s.length(); for (int i = 0; i < len; ++i) { char x = s.charAt(i), y = t.charAt(i); if ((s2t.containsKey(x) && s2t.get(x) != y) || (t2s.containsKey(y) && t2s.get(y) != x)) { return false; } s2t.put(x, y); t2s.put(y, x); } return true; } }

思路2(数组)

定义两个数组来记录字符出现的位置,如果遍历到 s 和 t 的字符是新字符,那么就在对应的位置(char本质是一个整数,每个字符都有着自己的ASCII 码,相应位置坐标就是对应的ASCII 码,相应位置元素初始值为 0)元素+1,如果是记录过的字符,对应的位置元素值相等那说明上一次出现位置相同,并更新位置元素+1;对应的位置元素值不相等说明一个字符对应了两个不同的字符

来举个例子更方便理解:第一个例子:egg->add;第二个例子:foo->baf

索引 is 字符t 字符sRecent[e]tRecent[a]判断操作
0ea00相等都更新为 1
1gd00相等都更新为 2
2gd22相等都更新为 3
索引 is 字符t 字符sRecent[f]tRecent[b]判断操作
0fb00相等更新为 1
1oa00相等更新为 2
2or20不相等❌ 直接返回 false

代码2

class Solution { public boolean isIsomorphic(String s, String t) { if (s.length() != t.length()) return false; int[] sRecent = new int[250]; int[] tRecent = new int[250]; for (int i = 0; i < s.length(); i ++) { char sc = s.charAt(i); char tc = t.charAt(i); if (sRecent[sc] != tRecent[tc]) return false; sRecent[sc] = i+1; tRecent[tc] = i+1; } return true; } }

小舟有话说

如果喜欢的话,点点关注,下次不迷路~

http://www.jsqmd.com/news/545890/

相关文章:

  • 一文读懂大模型,彻底告别 AI 焦虑 | 零门槛
  • NaViL-9B实战教程:用Python requests封装图文问答API调用函数
  • 终极指南:如何使用 !important 高效覆盖 BootstrapBlazor 组件样式
  • python基于微信小程序的家政服务与互助平台
  • 【Acadrust】Rust 语言的高性能 CAD 库
  • 使用UI-TARS-desktop实现跨应用数据同步:ERP与CRM系统集成
  • Flowable 7.x 实战:手把手教你从数据库里捞出BPMN2.0 XML并优雅展示(Vue3 + Spring Boot)
  • 3 月小结
  • Win10下mitie安装失败:subprocess.CalledProcessError的深度排查与实战修复
  • 从数据采集到模型部署:用Lerobot+本地数据集训练一个会抓积木的机械臂(避坑指南)
  • 如何快速完成笔记迁移:Obsidian Importer 完整实战指南
  • 深度实战:数据库工程与SQL调优——从索引失效到千万级数据秒查
  • PTA 编程题(C语言)-- 解密兔子繁殖问题的迭代算法
  • OpenOCD入门到精通:第27章 综合实战:STM32 全流程开发
  • Tiktok Shop PHP SDK 深度解析:企业级电商集成架构设计与最佳实践
  • MobaXterm专业版功能解析与使用教程:提升开发效率的终端工具
  • Kite心跳机制深度剖析:如何保证微服务高可用性
  • M3U8live.cn:轻量无广告的 HLS 流媒体在线调试神器,开发者必备
  • HP-Socket开源项目媒体合作后续跟进:反馈与关系维护
  • 如何在Linux上为MacBook安装智能风扇控制工具MBPFan:解决过热问题的完整指南
  • 解决Windows PM2服务化难题:开发者与运维的离线部署实践指南
  • RPA-Python与pytest-openstackclient集成:10步实现OpenStack测试自动化完整指南
  • ArcGIS Desktop绘图工具条保姆级详解:从画个框到专业地图标注,手把手教你玩转图形元素
  • 为什么92%的FastAPI AI项目在v2.0升级后流式中断?揭秘官方未文档化的3个协程陷阱及架构图级修复方案
  • UEFI调试日志过滤工具开发:5步实现自定义过滤工具
  • 终极PoeCharm指南:三步打造你的流放之路完美角色
  • 猫抓:一站式浏览器资源嗅探与下载解决方案
  • 联想笔记本BIOS解锁工具安全配置指南:从问题诊断到高级应用
  • OpenOCD入门到精通:第26章 代码贡献与社区参与
  • 笔记本插手机卡收不到短信?一个开关就能解决