解答代码如下:
class Solution {
public List<List<String>> groupStrings(String[] strings) {
List<List<String>> res = new ArrayList<>();
if(strings == null || strings.length == 0){
return res;
}
Map<String,List<String>> map = new HashMap<>();
for(int i=0;i<strings.length;i++){
String key = calculate(strings[i]);
List<String> list = map.getOrDefault(key,new ArrayList<String>());
list.add(strings[i]);
map.put(key,list);
}
Set<String> set = map.keySet();
Iterator<String> iterator = set.iterator();
while(iterator.hasNext()){
String key = (String)iterator.next();
res.add(map.get(key));
}
return res;
}
public String calculate(String str){
char[] arr = str.toCharArray();
int dis = arr[0] - 'a';
StringBuilder builder = new StringBuilder();
for(int i=0;i<arr.length;i++){
char temp = (char)(arr[i]-dis);
if(temp<'a'){
temp = (char)(temp+26);
}
builder.append(temp);
}
return builder.toString();
}
}
思路
这道题目的核心思路是将所有的字符串都转换成以"a"为首字母开头的字符串,并将该字符串作为key存储在hashmap中,这样一来所有结构相同的字符串都会存在相同的一个key下
注意点
字符加减
字符之间可以直接进行加减运算,得到的结果是整型
int dis = arr[0] - 'a';
字符也可以直接与数字进行相加减
temp = (char)(temp+26);
StringBuilder
之前没有系统学习过这个类
StringBuilder,它是一个可变对象,可以预分配缓冲区,这样,往StringBuilder中新增字符时,不会创建新的临时对象
-
append(String str)
将str追加到此字符序列后 -
insert(int i,String str)
将str追加到此字符序列的第i个位置 -
delete(int i,int j)
删除此字符序列的第i位置到第j位置 -
toString()
转化为字符串