0. 问题
给定两个字符串,确定其中一个字符串重新排列之后是否可以变成另外一个字符串。
1. 实现
注意:是否需要考虑大小写;是否需要考虑空格;
下面的实现考虑大小写和空格;
- (1)对两个字符串分别排序,排序之后若相等则可以;代码书写尽可能追求模块化和简洁;
/**
* 判断一个字符串是否可以通过排序变成另外一个字符串
*/
public static String stringSort(String s){
char[] chars = s.toCharArray();
Arrays.sort(chars);
return new String(chars);
}
public static boolean isSame(String s1, String s2){
if(s1.length() != s2.length()){
return false;
}
return stringSort(s1).equals(stringSort(s2));
}
- (2)统计每个字符串中各个字符出现的个数,然后进行比较;可以用计数数组实现,也可以使用hashmap的方式实现。
/**
* 通过hashmap实现
* 下面代码就不够简洁,可以将加入map的操作分割成一个单独的函数,因为其逻辑是相同的。
* hashmap中已经实现了equals方法了,所以直接调用即可。
*/
public static boolean isSame1(String s1, String s2){
if(s1.length() != s2.length()){
return false;
}
Map<Character, Integer> map1 = new HashMap<>();
Map<Character, Integer> map2 = new HashMap<>();
for(int i = 0; i < s1.length(); i++){
char temp = s1.charAt(i);
if(map1.containsKey(temp)){
map1.replace(temp, map1.get(temp)+1);
}
map1.put(temp, 1);
}
for(int i = 0; i < s2.length(); i++){
char temp = s2.charAt(i);
if(map2.containsKey(temp)){
map2.replace(temp, map2.get(temp)+1);
}
map2.put(temp, 1);
}
return map1.equals(map2);
}
/**
* 通过hashmap实现
* 下面代码就简洁了不少
*/
public static Map<Character, Integer> putIntoMap(String s){
Map<Character, Integer> map = new HashMap<>();
for(int i = 0; i < s.length(); i++){
char temp = s.charAt(i);
if(map.containsKey(temp)){
map.replace(temp, map.get(temp)+1);
}
map.put(temp, 1);
}
return map;
}
public static boolean isSame1(String s1, String s2){
if(s1.length() != s2.length()){
return false;
}
return putIntoMap(s1).equals(putIntoMap(s2));
//下面这样就更简洁了
//return s1.length() == s2.length() && putIntoMap(s1).equals(putIntoMap(s2));
}