## Group Shifted Strings

• Time:O(\Sigma |\texttt{strings[i]}|)
• Space:O(\Sigma |\texttt{strings[i]}|)

## C++

``````class Solution {
public:
vector<vector<string>> groupStrings(vector<string>& strings) {
vector<vector<string>> ans;
unordered_map<string, vector<string>> keyToStrings;

for (const string& s : strings)
keyToStrings[getKey(s)].push_back(s);

for (const auto& [_, strings] : keyToStrings)
ans.push_back(strings);

return ans;
}

private:
// "abc" -> "11" because diff(a, b) = 1 and diff(b, c) = 1
string getKey(const string& s) {
string key;

for (int i = 1; i < s.length(); ++i) {
const int diff = (s[i] - s[i - 1] + 26) % 26;
key += to_string(diff) + ",";
}

return key;
}
};
``````

## JAVA

``````class Solution {
public List<List<String>> groupStrings(String[] strings) {
Map<String, List<String>> keyToStrings = new HashMap<>();

for (final String s : strings)

return new ArrayList<>(keyToStrings.values());
}

// "abc" -> "11" because diff(a, b) = 1 and diff(b, c) = 1
private String getKey(final String s) {
StringBuilder sb = new StringBuilder();

for (int i = 1; i < s.length(); ++i) {
final int diff = (s.charAt(i) - s.charAt(i - 1) + 26) % 26;
sb.append(diff).append(",");
}

return sb.toString();
}
}
``````

## Python

``````class Solution:
def groupStrings(self, strings: List[str]) -> List[List[str]]:
keyToStrings = defaultdict(list)

# 'abc' . '11' because diff(a, b) = 1 and diff(b, c) = 1
def getKey(s: str) -> str:
key = ''

for i in range(1, len(s)):
diff = (ord(s[i]) - ord(s[i - 1]) + 26) % 26
key += str(diff) + ','

return key

for s in strings:
keyToStrings[getKey(s)].append(s)

return keyToStrings.values()
``````