使用hashmap确定一个字符串是否是另一个字符串的排列(最佳解决方案)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用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循环做同样的事情是多余的和不必要的。但是,我不确定如何以另一种方式做到这一点。请帮忙!
首先,如果字符串的长度不同,则它们不是排列。首先检查长度。 (您可能还想对参数进行空值检查。)
if (msg1.length() != msg2.length()) return false;
接下来,您不会考虑邮件本身是否包含重复字符。 “消息”和“消息”怎么样?你会得到4
,而不是2
。
而不是添加,从地图中的1
中找到的每个字符中减去msg2
。如果你低于0
,你在msg2
找到了比msg1
更多的角色实例,你可以立即返回false
。如果在地图中找不到某个角色,那么你在msg2
中找到了一个msg
中不存在的角色,你可以立即返回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
而你甚至不需要isPermutation
方法来自你的代码。
如果您有一组有限的可能字符,例如仅限ASCII,然后您可以用Map
替换int[]
以获得性能。数组的大小是允许的字符范围,索引是字符的ASCII代码,数组元素是频率。
以上是关于使用hashmap确定一个字符串是否是另一个字符串的排列(最佳解决方案)的主要内容,如果未能解决你的问题,请参考以下文章
将 HashMap 的创建迭代为另一个 HashMap 中的值