Given a string, we can "shift" each of its letter to its successive letter, for example: "abc" -> "bcd"
. We can keep "shifting" which forms the sequence:
"abc" -> "bcd" -> ... -> "xyz"
Given a list of strings which contains only lowercase alphabets, group all strings that belong to the same shifting sequence.
For example, given: ["abc", "bcd", "acef", "xyz", "az", "ba", "a", "z"]
,
A solution is:
[ ["abc","bcd","xyz"], ["az","ba"], ["acef"], ["a","z"] ]
用hashmap做
public List<List<String>> groupStrings(String[] strings) {
HashMap<String, List<String>> map = new HashMap<>();
for(String str: strings){
if(str== null || str.length() == 0) continue;
StringBuffer sb = new StringBuffer();
for(int i=1;i<str.length();i++){
char ch1 = str.charAt(i);
char ch2 = str.charAt(i-1);
if(ch1<ch2){
ch1 = (char)(ch1+26);
}
sb.append(ch1 - ch2);
}
if(!map.containsKey(sb.toString())){
map.put(sb.toString(), new ArrayList<>());
}
map.get(sb.toString()).add(str);
}
List<List<String>> result = new ArrayList<>();
for(Map.Entry<String, List<String>> entry: map.entrySet()){
result.add(entry.getValue());
}
return result;
}