package LeetCode_249
/**
* 249. Group Shifted Strings
* (Prime)
* 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.
Example:
Input: ["abc", "bcd", "acef", "xyz", "az", "ba", "a", "z"],
Output:
[
["abc","bcd","xyz"],
["az","ba"],
["acef"],
["a","z"]
]
* */
class Solution {
/*
* solution: HashMap, save list of string with same key
* n: size fo array
* l: length of string
* Time complexity:O(n*l), Space complexity:O(n)
* */
fun groupStrings(strings: Array<String>): List<List<String>> {
val result = ArrayList<ArrayList<String>>()
//key: the string that each letter has same ascii offset
//value: ArrayList, contains string with same key
val map = HashMap<String, ArrayList<String>>()
for (string in strings) {
//use first char for the offset
var key = ""
val offset = string[0] - 'a'
for (c in string) {
var char = c - offset
//if char not a letter, need add 26,let change to letter
//for example: ` to z
if (char < 'a') {
char += 26
}
key += char
}
if (!map.contains(key)) {
map.put(key, ArrayList())
}
map.get(key)!!.add(string)
}
for (item in map) {
result.add(item.value)
}
return result
}
}