LeetCode算法题-Isomorphic Strings(Java实现)
这是悦乐书的第191次更新,第194篇原创
01 看题和准备
今天介绍的是LeetCode算法题中Easy级别的第50题(顺位题号是205)。给定两个字符串s和t,确定它们是否是同构的。如果s中的字符可以替换为t,则两个字符串是同构的。
所有出现的字符必须替换为另一个字符,同时保留字符的顺序。 没有两个字符可以映射到相同的字符,但字符可以映射到自身。例如:
输入:s =“egg”,t =“add”
输出:true
输入:s =“foo”,t =“bar”
输出:false
输入:s =“paper”,t =“title”
输出:true
注意:可以假设s和t都具有相同的长度。
本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。
02 第一种解法
因为题目已经假设两个字符串的长度是相等的,所以不用考虑特殊情况。
使用两个HashMap,分别存储字符串s和字符串t的每一位字符,再使用两个新的字符串str和str2,分别存储其对应字符的结构,如果字符已经存在,则取出之前存的下标添加到str或str2中,如果是新出现,就把当前的下标添加到str或str2中。最后得到的str和str2就是s、t所表示的结构,如果str和str2相等,则返回true,否则返回false。
public boolean isIsomorphic(String s, String t) {
Map<Character, Integer> map = new HashMap<>();
String str = "";
for (int i=0; i<s.length(); i++) {
if (map.containsKey(s.charAt(i))) {
str = str + map.get(s.charAt(i));
} else {
map.put(s.charAt(i), i);
str += i;
}
}
Map<Character, Integer> map2 = new HashMap<>();
String str2 = "";
for (int j=0; j<t.length(); j++) {
if (map2.containsKey(t.charAt(j))) {
str2 = str2 + map2.get(t.charAt(j));
} else {
map2.put(t.charAt(j), j);
str2 += j;
}
}
return str.equals(str2);
}
时间复杂度:因为for循环中使用了HashMap的containsKey方法,而此方法最好的情况就是要判断的key正好是第一位,则containsKey方法的时间复杂度是O(1),最坏的情况是要判断的key在最后一位,则containsKey方法的时间复杂度是O(n)。因此,此解法的时间复杂度最好情况是O(n),最坏情况是O(n^2)。
空间复杂度:O(n)
03 第二种解法
依旧使用两个HashMap,同样是将两个字符串的各个字符放入map中,不过由第一种解法的分开放变成同时放,如果在进行put的时候,有两种情况:当前字符在map中不存在的时候,返回null;当前字符在map中存在的时候,返回此字符作为key所关联的之前的value。如果两边的字符进行put操作而不相等,即说明此字符在两个map中的其中一个已经出现过一次,但是另外一个没出现过,也就表示两字符串的结构是不同的。
public boolean isIsomorphic2(String s, String t) {
Map<Character, Integer> map = new HashMap<>();
Map<Character, Integer> map2 = new HashMap<>();
for (Integer i=0; i<s.length(); i++) {
if (map.put(s.charAt(i), i) != map2.put(t.charAt(i), i)) {
return false;
}
}
return true;
}
04 第三种解法
只使用一个HashMap。思路与上面两种解法类似,不过是将字符串s的各个字符当成了map的key,将字符串t的各个字符当成map的value。只要map中存在当前的字符key,那么其所对应的value应该和另外一个字符串的当前字符相等,否则就是结构不同。
public boolean isIsomorphic3(String s, String t) {
HashMap<Character, Character> map = new HashMap<>();
int size = s.length();
for (int i = 0; i < size; i++) {
if (map.containsKey(s.charAt(i))) {
if (t.charAt(i) != map.get(s.charAt(i))) {
return false;
}
} else {
if (map.containsValue(t.charAt(i))) {
return false;
}
map.put(s.charAt(i), t.charAt(i));
}
}
return true;
}
05 第四种解法
对于上面的解法使用HashMap来存字符,我们可以只用数组来替代,因为组成字符串的字符类型有限,ASCII码只有256个字符,所以我们预先定义好两个大小为256的整型数组,创建后两数组中的元素初始值都是0。此时,我们使用for循环对字符串s进行遍历,当前字符所表示的十进制值当做是数组的索引,如果该索引分别对应的值不相等,则说明两字符串不是同结构,否则,就将循环内的指针i作为其索引对应的值。其中i是从0开始的,但是数组初始化后其内所有元素都是默认值0,所以需要加1来区别默认值0。
public boolean isIsomorphic4(String s, String t) {
int[] m1 = new int[256];
int[] m2 = new int[256];
for (int i = 0; i < s.length(); i++) {
if (m1[s.charAt(i)] != m2[t.charAt(i)]) return false;
m1[s.charAt(i)] = i + 1;
m2[t.charAt(i)] = i + 1;
}
return true;
}
此解法时间复杂度是O(n),空间复杂度是O(1)。
06 小结
算法专题目前已连续日更超过一个月,算法题文章50+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!
LeetCode算法题-Isomorphic Strings(Java实现)的更多相关文章
- LeetCode算法题-Add Strings(Java实现)
这是悦乐书的第223次更新,第236篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第90题(顺位题号是415).给定两个非负整数num1和num2表示为字符串,返回num ...
- LeetCode算法题-Heaters(Java实现)
这是悦乐书的第239次更新,第252篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第106题(顺位题号是475).冬天来了!您在比赛期间的第一份工作是设计一个固定温暖半径 ...
- LeetCode算法题-Sqrt(Java实现)
这是悦乐书的第158次更新,第160篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第17题(顺位题号是69). 计算并返回x的平方根,其中x保证为非负整数. 由于返回类型 ...
- LeetCode算法题-Subdomain Visit Count(Java实现)
这是悦乐书的第320次更新,第341篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第189题(顺位题号是811).像"discuss.leetcode.com& ...
- LeetCode算法题-Number of Lines To Write String(Java实现)
这是悦乐书的第319次更新,第340篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第188题(顺位题号是806).我们要将给定字符串S的字母从左到右写成行.每行最大宽度为 ...
- LeetCode算法题-Unique Morse Code Words(Java实现)
这是悦乐书的第318次更新,第339篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第186题(顺位题号是804).国际莫尔斯电码定义了一种标准编码,其中每个字母映射到一系 ...
- LeetCode算法题-Rotate String(Java实现)
这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...
- LeetCode算法题-Rotated Digits(Java实现)
这是悦乐书的第316次更新,第337篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第185题(顺位题号是788).如果一个数字经过180度旋转后,变成了一个与原数字不同的 ...
- LeetCode算法题-Letter Case Permutation(Java实现)
这是悦乐书的第315次更新,第336篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第184题(顺位题号是784).给定一个字符串S,将每个字母单独转换为小写或大写以创建另 ...
随机推荐
- Hyperledger Fabric链码之二
上篇文章中我们介绍了链码的概念,本文中我们将介绍Fabric下链码的编写和测试.我们会通过一个简单例子的方式来阐述链码API的使用. 链码API 每一个链码程序都必须实现一个接口Chainco ...
- [翻译]一个新式的基于文本的浏览器 Browsh
介绍 什么是Browsh? Browsh是一个纯文本浏览器,可以运行在大多数的TTY终端环境和任何浏览器.目前1 ,终端客户端比浏览器客户端更先进2. TTY 客户端 终端客户端即时更新和交付,以便于 ...
- ife2018 零基础学院 day 4
第四天,背景边框列表链接和更复杂的选择器 背景,边框,列表,链接相关属性 背景 MDN 背景 W3School 背景 元素的背景是指,在元素内容.内边距和边界下层的区域. 属性 描述 backgrou ...
- [转]Docker学习之四:使用docker安装mysql
本文转自:https://blog.csdn.net/qq_19348391/article/details/82998391 Docker学习之一:注册Docker Hub账号 Docker学习之二 ...
- Intellij idea 项目目录设置 与包的显示创建
1.把目录设置成为层级结构显示.和eclipse类似 去掉flatten Packages前面的勾 在项目中创建多级包的时候要注意,必须在Java下建,并且要全输入才能识别
- spring boot 使用第三方jar的方法
2018/02/02 更新 mvnrepository.com已经提供了ms jdbc 的jar URL: http://mvnrepository.com/artifact/com.microsof ...
- mapper代理方式开发
使用mapper代理方式开发: 需要编写mapper接口,UserMapper.java需要编写映射文件,UserMapper.xml需要遵循一些开发规范,mybatis便可以自动生成mapper接口 ...
- Django---ORM中的锁和事务
---恢复内容开始--- 一 锁 行级锁 select_for_update(nowait=False,skip_locked=False) #注意必须用在事务里面,至于如何开启事务,往后看 返回一 ...
- 2018-06-21 中文代码示例视频演示Python入门教程第五章 数据结构
知乎原链 续前作: 中文代码示例视频演示Python入门教程第四章 控制流 对应在线文档: 5. Data Structures 这一章起初还是采取了尽量与原例程相近的汉化方式, 但有些语义较偏(如T ...
- OSGI企业应用开发(十五)基于Spring、Mybatis、Spring MVC实现一个登录应用
前面文章中,我们已经完成了OSGI应用中Spring.Mybatis.Spring MVC的整合,本篇文章我们就在这个基础上来完成一个简单的登录应用,其中用户名和密码需要从数据库中查询. 前面文章中, ...