Сложность: medium
Выполните следующие операции сдвига на строке:
Правый сдвиг: замените каждую букву следующей буквой английского алфавита, где 'z' заменяется на 'a'. Например, "abc" можно сдвинуть вправо на "bcd" или "xyz" можно сдвинуть вправо на "yza".
Левый сдвиг: замените каждую букву предыдущей буквой английского алфавита, где 'a' заменяется на 'z'. Например, "bcd" можно сдвинуть влево на "abc" или "yza" можно сдвинуть влево на "xyz".
Мы можем продолжать сдвигать строку в обоих направлениях, чтобы сформировать бесконечную последовательность сдвигов.
Например, сдвиньте "abc", чтобы сформировать последовательность: ... <-> "abc" <-> "bcd" <-> ... <-> "xyz" <-> "yza" <-> .... <-> "zab" <-> "abc" <-> ...
Вам дан массив строк strings, сгруппируйте все strings[i], которые принадлежат одной и той же последовательности сдвигов. Ответ можно вернуть в любом порядке.
Пример:
Input: strings = ["abc","bcd","acef","xyz","az","ba","a","z"]
Output: [["acef"],["a","z"],["abc","bcd","xyz"],["az","ba"]]
👨💻 Алгоритм:
1⃣Переберите строки, и для каждой строки найдите ее хэш-значение, сдвигая все символы так, чтобы строка начиналась с 'a'. Значение сдвига равно позиции первого символа строки, и каждый символ сдвигается на это значение с учетом модуля 26.
2⃣Сопоставьте оригинальную строку с найденным хэш-значением в карте mapHashToList, добавляя оригинальную строку в список, соответствующий ее хэш-значению.
3⃣Переберите mapHashToList и сохраните список для каждого ключа в карте в массив ответа groups.
😎 Решение:
class Solution {
func shiftLetter(_ letter: Character, _ shift: Int) -> Character {
return Character(UnicodeScalar((letter.asciiValue! - UInt8(shift) + 26) % 26 + 97))
}
func getHash(_ s: String) -> String {
let shift = Int(s.first!.asciiValue! - 97)
var hashKey = ""
for letter in s {
hashKey.append(shiftLetter(letter, shift))
}
return hashKey
}
func groupStrings(_ strings: [String]) -> [[String]] {
var mapHashToList = [String: [String]]()
for str in strings {
let hashKey = getHash(str)
if mapHashToList[hashKey] != nil {
mapHashToList[hashKey]!.append(str)
} else {
mapHashToList[hashKey] = [str]
}
}
return Array(mapHashToList.values)
}
}Ставь 👍 и забирай 📚 Базу знаний