题目来源
题目描述
class Solution{
public:
vector<vector<string>> groupStrings(vector<string>& strings){
}
};
分析
题目意思
- 将单词中的所有字符分成好几组,相同的放到一组
哪些字符应该放到一组呢?
如果s可以通过移位变成t,就是一组。可以分析出:
- 如果s和t长度不一致,肯定无法通过移位进行转换
- 如果 s 和 t 长度一致,且长度为 1,则肯定可以移位转换
- 果 s 和 t 长度一致且不为 1,则可以移位进行转换的判断是 s 的每一个字符都移动相同的步数变为 s
也就是说,字符串的每个字母和首字符的相对距离都是相等的
例子:
- 对于abc和efg:
- 对于abc来说,b和a的距离是1,c和a的距离是2
- 对于efg来说, f和e的距离是1,g和e的距离是2
- 对于az和yx:
- z和a的距离是25
- x和y的距离是25
算法:
- 遍历字典,对每一个word都映射成一个key。然后将key挂载的某个map下
- 最后遍历这个map,就可以得到分组了
class Solution{
public:
vector<vector<string>> groupStrings(vector<string>& strings){
std::vector<std::vector<std::string>> ans;
std::unordered_map<std::string, std::multiset<std::string>> m;
for(auto str : strings){
std::string t;
for(char ch : str){
t += std::to_string((ch + 26 - str[0]) % 26) + ",";
}
m[t].insert(t);
}
for(auto &it : m){
ans.emplace_back(it.second.begin(), it.second.end());
}
return ans;
}
};
类似题目
题目 | 思路 |
---|---|
leetcode:49. 字母异位词分组 Group Anagrams | 对每一个str,先排序得到value,然后key.push_back(value) ; |
leetcode:242. s是不是t的字母异位词Valid Anagram | s和t均排序,如果排序号相等,那么是 |
leetcode: 249. 移位字符串分组 Group Shifted Strings | 如果s可以通过移位变成t,就是一组。可以分析出:如果s和t长度不一致,肯定无法通过移位进行转换;如果 s 和 t 长度一致,且长度为 1,则肯定可以移位转换;如果 s 和 t 长度一致且不为 1,则可以移位进行转换的判断是 s 的每一个字符都移动相同的步数变为 s(也就是说,字符串的每个字母和首字符的相对距离都是相等的)。可以遍历字典,对每一个word都映射成一个key。然后将key挂载的某个map下,最后遍历这个map,就可以得到分组了 |