• 如何判断两个String是否是Anagrams_java实现


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

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

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

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

     1 public class CustomStringUtil  
     2 {  
     3 
     4    boolean firstIsAnagram(String sFirst, String sSecond)  
     5    {  
     6       char[] cFirstArray = sFirst.toCharArray();  
     7       char[] cSecondArray = sFirst.toCharArray();  
     8   
     9       Arrays.sort(cFirstArray);  
    10       Arrays.sort(cSecondArray);  
    11 
    12       return Arrays.equals(cFirstArray, cSecondArray);  
    13    }  
    14 }

    分析:

    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中的每一个字符xx对应的整型值是y,把k[y]1

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

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

    代码

     1 public class CustomStringUtil
     2 {
     3    public static boolean secondIsAnagram(String sFirst, String sSecond)
     4    {
     5       if (sFirst.length() != sSecond.length())
     6       {
     7          return false;
     8       }
     9       int[] asciiChars = new int[256];
    10       for (int i = sFirst.length() - 1; i>=0; --i)
    11       {
    12          ++asciiChars[sFirst.charAt(i)];   //关键代码
    13       }
    14       for (int i = sFirst.length() - 1; i>=0; --i)
    15       {
    16          char currChar = sSecond.charAt(i);
    17          if (asciiChars[currChar] == 0)
    18          {
    19             return false;
    20          }
    21          --asciiChars[currChar];
    22       }
    23       return true;
    24    }
    25 }

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

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

  • 相关阅读:
    利用TLE数据确定卫星轨道(1)-卫星轨道和TLE
    关于javascript的单线程和异步的一些问题
    javascript编译与运行机理(1)--
    springMVC解决跨域
    如何实现免登陆功能(cookie session?)
    Map 接口有哪些类
    平时使用了哪些线程池
    Maven install报错:MojoFailureException ,To see the full stack trace of the errors, re-run Maven with the -e switch.解决
    记录新建dorado项目更新规则中报错
    Dynamic Web Module 3.0 requires Java 1.6 or newer
  • 原文地址:https://www.cnblogs.com/tanfd/p/6099429.html
Copyright © 2020-2023  润新知