Given two strings, write a method to decide if one is a permutation of the other.
Example
abcd
is a permutation of bcad
, but abbe
is not a permutation of abe
函数头:public boolean Permutation(String A, String B)
算法:开一个int[] cnt数组,A里读到一个char就计数+1,B里读到一个char就计数-1,最后如果cnt都是0的话就说明两者计数一致,是正确的。数组不要用map取代,大材小用。
细节:1.因为是char,256个就可以枚举完ascii码的部分(虽然java里char是用两个字节存储的,有65536种可能),所以就只要开一个数组记录就好了,没必要用map。以后如果key本身就是数字型的(integer || char),就可以作为数组的idx来当key了,没必要用map数据类型。2.Map的一些用法。Set<Key> map.keySet(); Set<Entry<K,V>> map.entrySet(); Collection<V> map.values(); 三者取出来的可以遍历,记好函数名。然后Entry<K,V> entry的用法是K entry.getKey(); entry.getValue();
1.数组版
public class Solution { /* * @param A: a string * @param B: a string * @return: a boolean */ public boolean Permutation(String A, String B) { // write your code here if (A == null || B == null || A.length() != B.length()) { return false; } int[] cnt = new int[256]; for (int i = 0; i < A.length(); i++) { cnt[(int)A.charAt(i)]++; cnt[(int)B.charAt(i)]--; } for (int i = 0; i < cnt.length; i++) { if (cnt[i] != 0) { return false; } } return true; } }
2.用map的杀鸡用牛刀版
public class Solution { /* * @param A: a string * @param B: a string * @return: a boolean */ public boolean Permutation(String A, String B) { // write your code here if (A == null || B == null || A.length() != B.length()) { return false; } char[] charsA = A.toCharArray(); char[] charsB = B.toCharArray(); Map<Character, Integer> mapA = new HashMap<Character, Integer>(); Map<Character, Integer> mapB = new HashMap<Character, Integer>(); for (int i = 0; i < charsA.length; i++) { if (!mapA.containsKey(charsA[i])) { mapA.put(charsA[i], 1); } mapA.put(charsA[i], mapA.get(charsA[i]) + 1); } for (int i = 0; i < charsB.length; i++) { if (!mapB.containsKey(charsB[i])) { mapB.put(charsB[i], 1); } mapB.put(charsB[i], mapB.get(charsB[i]) + 1); } for (Character c : mapA.keySet()) { if (mapA.get(c) != mapB.get(c)) { return false; } } return true; } }