LeetCode题练习与总结:同构字符串--205

2024-08-24 14:28

本文主要是介绍LeetCode题练习与总结:同构字符串--205,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、题目描述

给定两个字符串 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. 首先检查两个字符串的长度是否相等,如果不相等,直接返回false。
  2. 创建两个HashMap,分别用于存储s到t的映射关系和t到s的映射关系。
  3. 遍历字符串s和t的每个字符,对于s中的每个字符,检查其在HashMap中的映射是否为t中对应的字符,如果不是,则返回false。
  4. 同样,对于t中的每个字符,检查其在另一个HashMap中的映射是否为s中对应的字符,如果不是,则返回false。
  5. 如果上述步骤都通过,则说明两个字符串是同构的,返回true。

三、具体代码

import java.util.HashMap;
import java.util.Map;class Solution {public boolean isIsomorphic(String s, String t) {if (s.length() != t.length()) {return false;}Map<Character, Character> mapSToT = new HashMap<>();Map<Character, Character> mapTToS = new HashMap<>();for (int i = 0; i < s.length(); i++) {char sChar = s.charAt(i);char tChar = t.charAt(i);// 检查s到t的映射if (mapSToT.containsKey(sChar)) {if (mapSToT.get(sChar) != tChar) {return false;}} else {mapSToT.put(sChar, tChar);}// 检查t到s的映射if (mapTToS.containsKey(tChar)) {if (mapTToS.get(tChar) != sChar) {return false;}} else {mapTToS.put(tChar, sChar);}}return true;}
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 首先检查两个字符串的长度是否相等,这是一个O(1)的操作,因为字符串的长度属性是预先计算好的。
  • 接下来是一个for循环,它遍历字符串s和t的每个字符,循环的次数为字符串的长度n。
  • 在循环内部,我们执行了常数时间的操作,包括:
    • 检查字符是否在HashMap中(O(1))。
    • 获取HashMap中的值(O(1))。
    • 将键值对插入到HashMap中(O(1))。

由于HashMap的插入和查找操作的平均时间复杂度是O(1),因此整个for循环的时间复杂度是O(n),其中n是字符串的长度。

综上所述,整个函数的时间复杂度是O(n)。

2. 空间复杂度
  • 我们使用了两个HashMap,mapSToT和mapTToS,来存储字符之间的映射关系。
  • 在最坏的情况下,如果字符串s和t中所有的字符都是唯一的,那么每个HashMap中将会存储n个键值对,其中n是字符串的长度。
  • 因此,两个HashMap总共需要O(n)的空间。

综上所述,整个函数的空间复杂度是O(n)。

五、总结知识点

  • 类定义 (class 关键字):

    • 定义了一个名为 Solution 的类。
  • 方法定义 (public boolean isIsomorphic(String s, String t)):

    • 定义了一个公共方法 isIsomorphic,它接受两个字符串参数 s 和 t,并返回一个布尔值。
  • 条件语句 (if):

    • 使用 if 语句来检查两个字符串的长度是否相等。
  • 数据结构 - HashMap (import java.util.HashMap;):

    • 导入了 HashMap 类,用于创建散列表来存储键值对。
    • 使用 HashMap 来存储字符之间的映射关系。
  • 循环结构 (for 循环):

    • 使用 for 循环来遍历字符串中的每个字符。
  • 字符操作 (char sChar = s.charAt(i);):

    • 使用 charAt 方法来获取字符串中指定位置的字符。
  • HashMap 操作:

    • 使用 containsKey 方法检查 HashMap 中是否包含特定的键。
    • 使用 get 方法从 HashMap 中获取与键相关联的值。
    • 使用 put 方法将键值对插入到 HashMap 中。
  • 逻辑运算 (return false;return true;):

    • 根据条件判断的结果返回布尔值 true 或 false
  • 字符串长度属性 (s.length()):

    • 使用字符串的 length 属性来获取字符串的长度。
  • 变量声明和初始化 (Map<Character, Character> mapSToT = new HashMap<>();):

    • 声明并初始化两个 HashMap 变量,用于存储字符映射关系。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

这篇关于LeetCode题练习与总结:同构字符串--205的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1102733

相关文章

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

Python 字符串裁切与提取全面且实用的解决方案

《Python字符串裁切与提取全面且实用的解决方案》本文梳理了Python字符串处理方法,涵盖基础切片、split/partition分割、正则匹配及结构化数据解析(如BeautifulSoup、j... 目录python 字符串裁切与提取的完整指南 基础切片方法1. 使用切片操作符[start:end]2

MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)

《MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)》本文给大家介绍MyBatis的xml中字符串类型判空与非字符串类型判空处理方式,本文给大家介绍的非常详细,对大家的学习或... 目录完整 Hutool 写法版本对比优化为什么status变成Long?为什么 price 没事?怎

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

C# $字符串插值的使用

《C#$字符串插值的使用》本文介绍了C#中的字符串插值功能,详细介绍了使用$符号的实现方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录$ 字符使用方式创建内插字符串包含不同的数据类型控制内插表达式的格式控制内插表达式的对齐方式内插表达式中使用转义序列内插表达式中使用

详解MySQL中JSON数据类型用法及与传统JSON字符串对比

《详解MySQL中JSON数据类型用法及与传统JSON字符串对比》MySQL从5.7版本开始引入了JSON数据类型,专门用于存储JSON格式的数据,本文将为大家简单介绍一下MySQL中JSON数据类型... 目录前言基本用法jsON数据类型 vs 传统JSON字符串1. 存储方式2. 查询方式对比3. 索引