GuilinDev

Lc0249

05 August 2008

249. Group Shifted Strings

通过将字符串的每个字母移动到其后续字母来移动字符串。

例如,“abc”可以转换为“bcd”。

我们可以不断移动字符串以形成一个序列。

例如,我们可以不断移动“abc”以形成序列:“abc”->“bcd”->…->“xyz”。

给定一个字符串数组,将属于同一移位序列的所有字符串 [i] 分组。您可以按任何顺序返回答案。

Example 1:

1
2
Input: strings = ["abc","bcd","acef","xyz","az","ba","a","z"]
Output: [["acef"],["a","z"],["abc","bcd","xyz"],["az","ba"]]

Example 2:

1
2
Input: strings = ["a"]
Output: [["a"]]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution {
    public List<List<String>> groupStrings(String[] strings) {
        List<List<String>> result = new ArrayList<>();
        Map<String, List<String>> map = new HashMap<>();
        for (String str : strings) {
            int offset = str.charAt(0) - 'a';
            StringBuilder key = new StringBuilder();
            for (int i = 0; i < str.length(); i++) {
                char ch = (char) (str.charAt(i) - offset);
                if ( ch < 'a') {
                    ch += 26;
                }
                key.append(ch);
            }
            if (!map.containsKey(key.toString())) {
                List<String> list = new ArrayList<String>();
                map.put(key.toString(), list);
            }
            map.get(key.toString()).add(str);
        }
        for (String key : map.keySet()) {
            List<String> list = map.get(key);
            Collections.sort(list);
            result.add(list);
        }
        return result;
    }
}