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. 重新想象 Windows 8 Store Apps (48) - 多线程之其他辅助类: SpinWait, SpinLock, Volatile, SynchronizationContext, CoreDispatcher, ThreadLocal, ThreadStaticAttribute

    [源码下载] 重新想象 Windows 8 Store Apps (48) - 多线程之其他辅助类: SpinWait, SpinLock, Volatile, SynchronizationCont ...

  2. csharp: Procedure with DAO(Data Access Object) and DAL(Data Access Layer)

    sql script code: CREATE TABLE DuCardType ( CardTypeId INT IDENTITY(1,1) PRIMARY KEY, CardTypeName NV ...

  3. mysql 64 zip download

    open the url  ::  http://dev.mysql.com/downloads/file/?id=461109 and click the location "no tha ...

  4. 由SimpleAyncTaskExecutor到ListenableFutureTask

    Spring AsyncExecutor观后感 导语 本来想看下spring关于Async&Sync TaskExecutor的主要内容,看着看着发现ListenableTaskExecuto ...

  5. ASP.NET WebAPI 14 仿写Filter管道

    WebAPI中有设计了几种管道(Channel),大概如下:HttpMessageHandler,ActionFilter管道,ExceptionFilter管道.在三种管道中HttpMessageH ...

  6. DigitalOcean上SSH Key的创建(附DigitalOcean邀请)

    DigitalOcean是一家云主机商家,最低配置512M内存,20G的SSD,每月只有5刀.半个月前刚刚在这上面买了一个VPS,创建Droplet的时候看见创建SSH Key的时候就有点懵,不知道这 ...

  7. 初学Node(一)国际惯例HelloWorld

    简介 没有用过Node,记的这些只是学习的笔记,有什么错的地方,望各位前辈指正. Node是一个服务器端Javascript解释器,依赖于Chrome v8引擎进行代码编译,事件驱动.非阻塞I/O都是 ...

  8. RHEL7软件包管理

    本文介绍RHEL7的软件包管理 RHEL7下主要有RPM和YUM这两种包管理: YUM使用简单但需要联网,YUM会去网上的YUM包源去获取所需要的软件包并获取该包依赖的其他包 RPM的需要的操作精度比 ...

  9. 对抗静态分析——so文件的加密

    [预备起~~~]最近在忙找工作的事情,笔试~面试~笔试~面试...很久没有写(pian)文(gao)章(fei).忙了一阵子之后,终于~~~到了选offer的阶段(你家公司不是牛吗,老子不接你家off ...

  10. iOS 模仿微信的照片选择器

    功能和微信的基本一致. 这个选择器使用了循环方式,保证在浏览图片时内存中只加载最多3张图片.稳定的内存大小,可定义图片尺寸.详细说明在github. 下载地址: https://github.com/ ...