使用hashmap确定一个字符串是否是另一个字符串的排列(最佳解决方案)

时间:2017-12-18 23:58:04

标签: java hashmap

问题是两个字符串,写一个方法来决定一个是另一个的排列。我想出了一个工作正常的代码但是我想知道是否有另一个解决方案不需要在我的哈希函数中重复使用for循环。可能吗?最好是一个for-loop而不是两个,还是无关紧要?

主要方法将进行以下调用:

hashFunction("dog", "god"); 

返回true。是否有一个更好的解决方案,称为isPermutation?

这是我的代码:

public static void isPermutation (Map<Character, Integer> charMap){
    boolean isPerm = true;
    for(Integer value : charMap.values()){
        if(value != 2)
            isPerm = false;
    }
    System.out.println(isPerm);
}

public static void hashFunction(String msg1, String msg2){

    Map<Character, Integer> hMap = new HashMap <Character, Integer>();

    for(Character c : msg1.toCharArray()){
        if(!hMap.containsKey(c)){
            hMap.put(c, 1);
        }else{
            hMap.put(c, hMap.get(c)+1);
        }
    }

    for(Character c : msg2.toCharArray()){
        if(!hMap.containsKey(c)){
            hMap.put(c, 1);
        }else{
            hMap.put(c, hMap.get(c)+1);
        }
    }

    isPermutation(hMap);
}

我觉得有两个for循环执行完全相同的操作是多余的和不必要的。但是,我不确定如何以另一种方式做到这一点。请帮忙!

1 个答案:

答案 0 :(得分:1)

首先,如果字符串的长度不同,则它们不是排列。首先检查长度。 (您可能还想对参数进行空值检查。)

if (msg1.length() != msg2.length()) return false;

接下来,您不会考虑邮件本身是否包含重复字符。怎么样&#34;消息&#34;和&#34;消息&#34;?您将获得4的计数,而不是2

而不是在地图中的1中找到的每个字符中添加减去 msg2。如果您低于0,则msg2中的字符实例比msg1中的字符更多,您可以立即返回false。如果在地图中找不到某个角色,那么您在msg2中找不到msg中不存在的角色,您可以立即返回{{ 1}}。

false

如果您浏览完整个字符串for(Character c : msg2.toCharArray()){ if(!hMap.containsKey(c)){ return false; }else{ int freq = hMap.get(c) - 1; if (freq < 0) return false; hMap.put(c, freq - 1); } } ,那么您就知道msg2中的字符数不会高于msg2中的字符数且字符总数相同,所以您可以返回msg1,甚至不需要代码中的true方法。

如果你有一组有限的可能字符,例如仅限ASCII,然后您可以将isPermutation替换为Map以获得性能。数组的大小是允许的字符范围,索引是字符的ASCII代码,数组元素是频率。