Perform the following shift operations on a string:
Right shift: Replace every letter with the successive letter of the English alphabet, where 'z' is replaced by 'a'. For example, "abc" can be right-shifted to "bcd" or "xyz" can be right-shifted to "yza".
Left shift: Replace every letter with the preceding letter of the English alphabet, where 'a' is replaced by 'z'. For example, "bcd" can be left-shifted to "abc" or "yza" can be left-shifted to "xyz".
We can keep shifting the string in both directions to form an endless shifting sequence.
For example, shift "abc" to form the sequence: ... <-> "abc" <-> "bcd" <-> ... <-> "xyz" <-> "yza" <-> .... <-> "zab" <-> "abc" <-
You are given an array of strings strings, group together all strings[i] that belong to the same shifting sequence. You may return the answer in any order.
Example 1:
Input: strings = ["abc","bcd","acef","xyz","az","ba","a","z"]
Output: [["acef"],["a","z"],["abc","bcd","xyz"],["az","ba"]]Example 2:
Input: strings = ["a"]
Output: [["a"]]Constraints:
1 <= strings.length <= 2001 <= strings[i].length <= 50strings[i] consists of lowercase English letters.class Solution:
def groupStrings(self, strings: List[str]) -> List[List[str]]:
def get_hash(string: str):
key = []
for a, b in zip(string, string[1:]):
key.append(chr((ord(b) - ord(a)) % 26 + ord('a')))
return ''.join(key)
# Create a hash value (hash_key) for each string and append the string
# to the list of hash values i.e. mapHashToList["cd"] = ["acf", "gil", "xzc"]
groups = collections.defaultdict(list)
for string in strings:
hash_key = get_hash(string)
groups[hash_key].append(string)
# Return a list of all of the grouped strings
return list(groups.values())Where is the length of
stringsand is the maximum length of a string instrings.