LeetCode242详细分析并附求解代码

来源:互联网 发布:犀牛社淘宝论坛 编辑:程序博客网 时间:2024/06/04 18:02


题干分析:

    本题介绍了一种异位构词游戏,具体为给定一个字符串,如果另外一个字符串只是将该给定字符串中的字符进行了位置的对换则返回true,如果另外一个字符串出现新的字符或者出现与给定字符串中有的字符个数不相同等情况就返回false。

解题分析:

    由于要对两个字符串进行比较,但是只要对两个字符串中的字符个数以及各自字符串每种字符出现的个数进行比较,所以首先是利用toCharArray()方法将字符串转化为字符数组,然后应该有一个方法可以实现将字符串中的字符的类别以及对应字符在字符串中出现的频次进行统计,java中的Map接口刚好具有这种可以储存唯一的key和值的功能,所以首先确定使用Map来解决该题。然后是分别将两个字符串装入到两个不同的Map中,最后对这两个Map进行比较。

问题解决:

    import java.util.HashMap;

    import java.util.Iterator;

    import java.util.Map;

    import java.util.Map.Entry;

    import java.util.Set;

    public class Solution {

        public booleanisAnagram(String s, String t) {

          if(s.length()!=t.length())

                 return false;

           char[] sh=s.toCharArray();

           char[] th1=t.toCharArray();

           //对s字符串创建map

           int value=1;

           Map<Integer,Integer> map =new HashMap<Integer,Integer>();

           for(int i=0;i<s.length();i++){ 

                 if(map.containsKey((int)sh[i])){

                      value=map.get((int)sh[i]);

                      value++;

                 }else

                      value=1;

                 map.put((int)sh[i], value);

           }

           //对t字符串创建map

           int valuet=1;

           Map<Integer,Integer> map1 =new HashMap<Integer,Integer>();

           for(int i=0;i<t.length();i++){  

                 if(map1.containsKey((int)th1[i])){

                      valuet=map1.get((int)th1[i]);

                      valuet++;

                 }else

                      valuet=1;

                 map1.put((int)th1[i],valuet);

           }

           //比较

           if(map.size()!=map1.size()){

                 return false;

           }else{

                 if(map.equals(map1))

                      return true;

                 else

                      return false;

           }    

        }

    }

本题总结:

    一:由于Map所存储的Key是唯一的,所以所遇到的第一个问题是对于相同的key怎么进行对其对应的值value进行叠加计数的问题。本题采用的map中的get()函数,该函数在给定key的时候可以返回该key对应得value,通过判断map中有没有该key(使用containsKey()函数,该函数在map中含有指定的key时返回true,否则返回false),如果有就取得该value,然后进行加1,如果没有就让value为1。这样就能建立与该字符串对应的map,代码如下:

    ​    ​    ​    ​intvalue=1;

           Map<Integer,Integer> map =new HashMap<Integer,Integer>();

           for(int i=0;i<s.length();i++){ 

                 if(map.containsKey((int)sh[i])){

                      value=map.get((int)sh[i]);

                      value++;

                 }else

                      value=1;

                 map.put((int)sh[i], value);

           }

二:Integer是类,是java的包装类。int是基本数据类型,Integer是引用类,包含很多属性和方法,而int只是一个值,没有其他的任何方法和属性了。如果一个方法所使用的参数为Object类,而想传入的数据是除int之外的基本数据类型,可以通过(int)强转的方法来进行使用该方法。

三:代码的优化部分:(1)代码中首先进行判断两个字符串长度是不是相同,如果字符串的长度都不相同,那么这两个字符串肯定不是异位构词的;(2)考虑到可能两个字符串相同但是其中的某个字符变成另外一个该字符串中没有的新的字符,那么这样就会在map统计的时候出现不同的key,所以可以先比较key的长度而不用比较每个key的值就能知道两个字符串不是异位重组的;(3)map中提供了比较两个map是不是相同的方法,eauals(Object o),该方法能够比较指定的对象与此映射是否相等,该方法可以比较两个map中的每个键值对。

最终Submit Solution之后击败了18.33%的对手。

 

0 0
原创粉丝点击