ID | Title | Difficulty | |
---|---|---|---|
Loading... |
249. Group Shifted Strings
Medium
LeetCode
Array, Hash Table, String
Problem
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 non-empty 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"]
]
Code
class Solution {
public List<List<String>> groupStrings(String[] strings) {
HashMap<String, List<String>> map = new HashMap<>();
for(String s : strings) {
String key = helper(s);
if(!map.containsKey(key)) {
map.put(key, new ArrayList<>());
}
map.get(key).add(s);
}
List<List<String>> res = new ArrayList<>();
for(List<String> l : map.values()) {
res.add(l);
}
return res;
}
private String helper(String s) {
int dis = s.charAt(0) - 'a';
char[] carr = new char[s.length()];
carr[0] = 'a';
for(int i = 1; i < s.length(); i++) {
char c = (char)(s.charAt(i) - dis);
if(c < 'a') {
c += 26;
}
carr[i] = c;
}
return new String(carr);
}
}
class Solution:
def groupStrings(self, strings: List[str]) -> List[List[str]]:
map = defaultdict(list)
def getKey(s:str):
d = ord(s[0]) - ord('a')
r = ""
for c in s:
dd = ord(c) - d
if dd < ord('a'):
dd += 26
r += chr(dd)
return r
for s in strings:
key = getKey(s)
map[key].append(s)
return map.values()
按 <- 键看上一题!
248. Strobogrammatic Number III
按 -> 键看下一题!
250. Count Univalue Subtrees