这是悦乐书的第198次更新,第205篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第61题(顺位题号是242)。给定两个字符串s和t,写一个函数来确定t是否是s的anagram。例如:

输入:s =“anagram”,t =“nagaram”

输出:true

输入:s =“rat”,t =“car”

输出:false

注意:您可以假设该字符串仅包含小写字母。

跟进:如果输入包含unicode字符怎么办? 您如何使您的解决方案适应这种情况?



本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

关于题目中anagram的意思,结合给出的两个示例,大意就是两字符串使用的小写字母一样,但是每个字母所处的位置不是全都一样。此解法是将两字符串s、t转换为字符数组,然后将数组排序,最后比较两数组的元素是否相等,这里借助了工具类Arrays。

此解法的时间复杂度是O(nlog(n)),空间复杂度是O(n)。

public boolean isAnagram(String s, String t) {
if (s == null || t == null || s.length() != t.length()) {
return false;
}
char[] ch = s.toCharArray();
char[] ch2 = t.toCharArray();
Arrays.sort(ch);
Arrays.sort(ch2);
return Arrays.equals(ch, ch2);
}

03 第二种解法

题目限制了只有英文小写字母,我们可以定义一个长度只有26的整数数组,对字符串进行遍历,以当前字符减去字符a所表示的整数为索引,找到对应元素,字符串s所在的字符进行自增,字符串t所在的字符进行自减,然后判断数组中的元素,只要任一元素不等于0,则说明s和t不满足anagram的条件。

此解法时间复杂度是O(n),空间复杂度是O(1)。

public boolean isAnagram2(String s, String t) {
if (s == null || t == null || s.length() != t.length()) {
return false;
}
int[] arr = new int[26];
for (int i=0; i<s.length(); i++) {
arr[s.charAt(i)-'a']++;
arr[t.charAt(i)-'a']--;
}
for(int num : arr) {
if (num != 0) {
return false;
}
}
return true;
}

04 第三种解法

使用HashMap,key为字符串的单个字符,value为此字符出现的次数,这里借助HashMap的getOrDefault方法来实现,如果存在该key,返回对应的value,否则返回默认值。

先将字符串s的每个字符存入HashMap中,然后遍历字符串字符串t,依次获取每一个字符,如果当前字符不在HashMap中存在,直接返回false,然后将字符存进HashMap中,value值减1,如果当前字符的出现次数为0了,将其remove掉,最后判断HashMap是否为空。

此解法因为用到了map.containsKey()方法,所以时间复杂度最好的情况是O(n),最坏的情况是O(n^2),空间复杂度是O(n)。

public boolean isAnagram3(String s, String t) {
if (s == null || t == null || s.length() != t.length()) {
return false;
}
HashMap<Character,Integer> map = new HashMap<Character,Integer>();
for (int i=0; i<s.length(); i++) {
char ch = s.charAt(i);
map.put(ch, map.getOrDefault(ch, 0)+1);
}
for (int j=0; j<t.length(); j++) {
char ch = t.charAt(j);
if (!map.containsKey(ch)) {
return false;
}
map.put(ch, map.get(ch)-1);
if (map.get(ch) == 0) {
map.remove(ch);
}
}
return map.isEmpty();
}

此解法是可以应对那些带有unicode字符的字符串,当然也可以使用像第二种解法的那样,使用数组,但是数组容量要扩大到256,其他的思路都是一样的。

05 小结

算法专题目前已连续日更超过一个月,算法题文章61+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-Valid Anagram(Java实现)的更多相关文章

  1. LeetCode算法题-Valid Palindrome II(Java实现)

    这是悦乐书的第287次更新,第304篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第155题(顺位题号是680).给定非空字符串s,最多可以删除一个字符. 判断它是否是回 ...

  2. LeetCode算法题-Valid Perfect Square(Java实现-四种解法)

    这是悦乐书的第209次更新,第221篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第77题(顺位题号是367).给定正整数num,写一个函数,如果num是一个完美的正方形 ...

  3. LeetCode算法题-Valid Palindrome(Java实现)

    这是悦乐书的第174次更新,第176篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第33题(顺位题号是125).给定一个字符串,确定它是否是回文,只考虑字母数字字符并忽略 ...

  4. LeetCode算法题-Heaters(Java实现)

    这是悦乐书的第239次更新,第252篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第106题(顺位题号是475).冬天来了!您在比赛期间的第一份工作是设计一个固定温暖半径 ...

  5. LeetCode算法题-Sqrt(Java实现)

    这是悦乐书的第158次更新,第160篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第17题(顺位题号是69). 计算并返回x的平方根,其中x保证为非负整数. 由于返回类型 ...

  6. 【算法】LeetCode算法题-Valid Parentheses

    这是悦乐书的第147次更新,第149篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第6题(顺位题号是20),给定一个只包含字符'(',')','{','}','['和'] ...

  7. LeetCode算法题-Subdomain Visit Count(Java实现)

    这是悦乐书的第320次更新,第341篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第189题(顺位题号是811).像"discuss.leetcode.com& ...

  8. LeetCode算法题-Number of Lines To Write String(Java实现)

    这是悦乐书的第319次更新,第340篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第188题(顺位题号是806).我们要将给定字符串S的字母从左到右写成行.每行最大宽度为 ...

  9. LeetCode算法题-Unique Morse Code Words(Java实现)

    这是悦乐书的第318次更新,第339篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第186题(顺位题号是804).国际莫尔斯电码定义了一种标准编码,其中每个字母映射到一系 ...

随机推荐

  1. C#函数返回值。

    一.params. 可变参数,无论有几个参数,必须出现在参数列表的最后,可以为可变参数直接传递一个对应类型的数组. class Program { static void Main(string[] ...

  2. ASP.NET资源大全-知识分享

    API 框架 NancyFx:轻量.用于构建 HTTP 基础服务的非正式(low-ceremony)框架,基于.Net 及 Mono 平台.官网 ASP.NET WebAPI:快捷创建 HTTP 服务 ...

  3. Linux-cut命令(22)

    cut剪切命令cut命令通常用来对某个文本文件进行解析,擅长处理以一个字符间隔的文本内容 -b :以字节(bytes)为单位进行分割.这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志. -c ...

  4. struts2_struts.xml配置文件讲解

    1.bean Bean详细讲解:https://www.cnblogs.com/lulu638/p/4340703.html 2.constant constant属性配置,可配置的属性可以参考def ...

  5. struts2_HelloWorld

    第一个Struts2程序-Hello 1.创建web工程struts2-01-Hello 2.导入jar包到bin目录,jar地址: https://files.cnblogs.com/files/a ...

  6. 记录ThreadPoolTaskExecutor线程池的在项目中的实际应用,讲解一下线程池的配置和参数理解。

    前言:最近项目中与融360项目中接口对接,有反馈接口(也就是我们接收到请求,需要立即响应,并且还要有一个接口推送给他们其他计算结果),推送过程耗时.或者说两个接口不能是同时返回,有先后顺序. 这时我想 ...

  7. Netty实战十三之使用UDP广播事件

    1.UDP的基础知识 我们将会把重点放在一个无连接协议即用户数据报协议(UDP)上,它通常用在性能至关重要并且能够容忍一定的数据报丢失的情况下. 面向连接的传输(如TCP)管理了两个网络端点之间的连接 ...

  8. QueryRunner使用之可变条件的处理

    在三层架构的Dao层中,需要通过不确定的条件,从数据库查询结果. 可以利用List集合作为容器将条件存储起来. 实际开发中的代码: public List<Hotel> searchByF ...

  9. JAVA JVM常见内存参数配置简析

    JVM常见内存参数配置简析   常见参数 -Xms .-Xmx.-XX:newSize.-XX:MaxnewSize.-Xmn(-XX:newSize.-XX:MaxnewSize) 简析 1.-Xm ...

  10. Gvim 和vim 有什么区别

    Gvim 和vim 有什么区别 Gvim是windows的 vim是linux的黑色的命令符 Gvim是单独的窗口下的vim,像notepad一样. vim就是在黑乎乎的cmd窗口下的编辑器.wind ...