Anagrams:是颠倒字母顺序的字符串

本文提供三个方法,分别分析时间空间复杂度

方法一:暴力遍历 时间复杂度:O(n^2)

方法二:基于排序算法,Sorting的时间复杂度是O(n*log(n))。所以先把两个字符数字进行排序,再判断。

 public class CustomStringUtil  
{      boolean firstIsAnagram(String sFirst, String sSecond)  
   {  
      char[] cFirstArray = sFirst.toCharArray();  
      char[] cSecondArray = sFirst.toCharArray();  
  
      Arrays.sort(cFirstArray);  
      Arrays.sort(cSecondArray);         return Arrays.equals(cFirstArray, cSecondArray);  
   }  
}

分析:

(1)把一个String转换成char[],时间:O(n),空间:O(n)(数组占用的)

(2)给数组排序:时间:O(n*log(n)),空间:O(n)

(2)比较这两个数组:时间:O(n),空间:O(1)(可能一些临时计数器可能会用到一点空间)

总结:这个算法的时间复杂度是:O(n*log(n))

方法三:应用哈希表的思想。

首先我们知道,在ASCII Table中每个字符串对应一个整形数,这里我们就利用这一点,把这个整形数当做数组的下标,这样一个字符就对应到数组中的唯一一个位置。

算法思想:我们可以用一个数组,数组下标就是字符的索引,然后计算字符串中每个字符出现的次数。在第一个字符串中,每出现一个字符就在相应的数组位置上加一;在第二个字符串中,每出现一个字符就在数组相应的位置上减一。我们这样操作先遍历第一个字符串,再遍历第二个字符串,这两个字符串是Anagrams的唯一一种情况就是最后这个数组还是全0。就意味着这两个字符串中某一个特定的字符个数相同。

算法步骤:

(1)生成一个236位的整数数组k

(2)对于第一个字符串sFirst中的每一个字符x,x对应的整型值是y,把k[y]加1

(3)对于第二个字符串sSecond中的每一个字符x,x对应的整型值是y,把k[y]减1

(4)如果数组k仍然是全零,那么字符串sFirst和sSecond就是Anagrams

代码

 public class CustomStringUtil
{
public static boolean secondIsAnagram(String sFirst, String sSecond)
{
if (sFirst.length() != sSecond.length())
{
return false;
}
int[] asciiChars = new int[256];
for (int i = sFirst.length() - 1; i>=0; --i)
{
++asciiChars[sFirst.charAt(i)]; //关键代码
}
for (int i = sFirst.length() - 1; i>=0; --i)
{
char currChar = sSecond.charAt(i);
if (asciiChars[currChar] == 0)
{
return false;
}
--asciiChars[currChar];
}
return true;
}
}

分析:时间:O(n)(遍历一次数组的时间)空间O(1)(空间不随着处理的字符串的大小而变化)

注意:这上面的代码做了一个假设:就是我们有一个确定的256个字符的集合。要注意到,这个假设对于编程来说是一个巨大的陷阱,我们应该非常小心。

如何判断两个String是否是Anagrams_java实现的更多相关文章

  1. 取两个String数组的交集

    import org.testng.annotations.Test; import java.util.HashMap; import java.util.LinkedList; import ja ...

  2. 【跟着子迟品 underscore】JavaScript 中如何判断两个元素是否 "相同"

    Why underscore 最近开始看 underscore.js 源码,并将 underscore.js 源码解读 放在了我的 2016 计划中. 阅读一些著名框架类库的源码,就好像和一个个大师对 ...

  3. java 判断两个时间相差的天数

    1.实现目标 输入:两个日期 输出:两个日期相差的天数 2.代码实现 方法1: 通过Calendar类的日期比较.注意:这里需要考虑一下: 日期是跨年份的,如一个是2012年,一个是2015年的   ...

  4. java integer对象判断两个数字是否相等

    java integer对象判断两个数字是否相等,不一定对 问题发生的背景:javaweb的项目,起先,因为在java中实体类中的int类型在对象初始化之后会给int类型的数据默认赋值为0,这样在很多 ...

  5. 判断两个IP是否属于同一子网

    描述 子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据.子网掩码与IP地址结构相同,是32位二进制数,其中网络号部分全为“1”和主机号部分全为“0”.利用子网掩码可以判断两台主机是否 ...

  6. java中判断两个字符串是否相等的问题

    我最近刚学java,今天编程的时候就遇到一个棘手的问题,就是关于判断两个字符串是否相等的问题.在编程中,通常比较两个字符串是否相同的表达式是“==”,但在java中不能这么写.在java中,用的是eq ...

  7. [置顶] 如何判断两个IP大小关系及是否在同一个网段中

    功能点  判断某个IP地址是否合法 判断两个IP地址是否在同一个网段中 判断两个IP地址的大小关系 知识准备 IP协议 子网掩码 Java 正则表达式 基本原理 IP地址范围 0.0.0.0- 255 ...

  8. Java与JavaScript中判断两字符串是否相等的区别

    JavaScript是一种常用的脚本语言,这也决定了其相对于其他编程语言显得并不是很规范.在JavaScript中判断两字符串是否相等 直接用==,这与C++里的String类一样.而Java里的等号 ...

  9. js中的传值和传引用,判断两个数组是否相等

    所谓js的中的传值,其实也就是说5种基本数据类型(null,undefind,boolean,number,string) 传引用也就是说的那个引用数据类型,(array和objec) 基本数据类型的 ...

随机推荐

  1. JSChart_页面图形报表

    首先在页头的"head"中加上: $(document).ready(function() { //myData与colors变量  是做演示用的,可以直接赋值给myChart就可 ...

  2. Free Slideshow, Gallery And Lightboxes Scripts

    http://bootstraphelpers.codeplex.com/SourceControl/list/changesets https://github.com/gordon-matt/Bo ...

  3. Win7配置Go环境

    最近想学习下Go语言,先从最基本的Hello Go开始,搭建Go开发环境 一.下载Go包 由于Go官网国内访问经常有问题,可以从国内的镜像下载: http://www.golangtc.com/ 二. ...

  4. [moka同学笔记]yii2.0的下拉菜单与bootstrap下拉菜单

    1.yii2下拉菜单 <li class="dropdown"><a href="#" class="dropdown-toggle ...

  5. Delphi的几个跨平台小游戏例子。

    Embarcadero开源了几个FireMonkey的小游戏,支持Windows, Android,Ios, MacOS等. 源码地址: https://github.com/EmbarcaderoP ...

  6. j2ee log4j集中式日志解决方案logpool v0.3

    V0.3相对于v0.2的更新如下:

  7. [mysql] 一次sql耗时高引发报警的分析和处理

    1.现象: 最近两天在每天的凌晨0:15-20分左右收到报警短息,报警内容: JDBC-SQL请求最近三分钟内平均耗时时间过高的报警,监控类型:SQL... 2.分析: 从现象来看 每天凌晨15分,可 ...

  8. 【GOF23设计模式】状态模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_状态模式.UML状态图.酒店系统房间状态.线程对象状态切换 package com.test.state; public ...

  9. VM虚拟机忘记密码

    关掉虚拟机. VM->Settings,选中Hard Disk,在右边出现了Utilities的一个下拉栏,OK,点击它选择Map,这时弹出一个"Map Virtual Disk&qu ...

  10. How to Build Office Developer Tools Projects with TFS Team Build 2012

    Introduction Microsoft Visual Studio 2012 provides a new set of tools for developing apps for Office ...