返回介绍

solution / 0200-0299 / 0249.Group Shifted Strings / README

发布于 2024-06-17 01:04:02 字数 3275 浏览 0 评论 0 收藏 0

249. 移位字符串分组

English Version

题目描述

给定一个字符串,对该字符串可以进行 “移位” 的操作,也就是将字符串中每个字母都变为其在字母表中后续的字母,比如:"abc" -> "bcd"。这样,我们可以持续进行 “移位” 操作,从而生成如下移位序列:

"abc" -> "bcd" -> ... -> "xyz"

给定一个包含仅小写字母字符串的列表,将该列表中所有满足 “移位” 操作规律的组合进行分组并返回。

 

示例:

输入:["abc", "bcd", "acef", "xyz", "az", "ba", "a", "z"]
输出:
[
  ["abc","bcd","xyz"],
  ["az","ba"],
  ["acef"],
  ["a","z"]
]
解释:可以认为字母表首尾相接,所以 'z' 的后续为 'a',所以 ["az","ba"] 也满足 “移位” 操作规律。

解法

方法一

class Solution:
  def groupStrings(self, strings: List[str]) -> List[List[str]]:
    mp = defaultdict(list)
    for s in strings:
      t = []
      diff = ord(s[0]) - ord('a')
      for c in s:
        d = ord(c) - diff
        if d < ord('a'):
          d += 26
        t.append(chr(d))
      k = ''.join(t)
      mp[k].append(s)
    return list(mp.values())
class Solution {
  public List<List<String>> groupStrings(String[] strings) {
    Map<String, List<String>> mp = new HashMap<>();
    for (String s : strings) {
      int diff = s.charAt(0) - 'a';
      char[] t = s.toCharArray();
      for (int i = 0; i < t.length; ++i) {
        char d = (char) (t[i] - diff);
        if (d < 'a') {
          d += 26;
        }
        t[i] = d;
      }
      String key = new String(t);
      mp.computeIfAbsent(key, k -> new ArrayList<>()).add(s);
    }
    return new ArrayList<>(mp.values());
  }
}
class Solution {
public:
  vector<vector<string>> groupStrings(vector<string>& strings) {
    unordered_map<string, vector<string>> mp;
    for (auto& s : strings) {
      int diff = s[0] - 'a';
      string t = s;
      for (int i = 0; i < t.size(); ++i) {
        char d = t[i] - diff;
        if (d < 'a') d += 26;
        t[i] = d;
      }
      cout << t << endl;
      mp[t].push_back(s);
    }
    vector<vector<string>> ans;
    for (auto& e : mp)
      ans.push_back(e.second);
    return ans;
  }
};
func groupStrings(strings []string) [][]string {
  mp := make(map[string][]string)
  for _, s := range strings {
    k := ""
    for i := range s {
      k += string((s[i]-s[0]+26)%26 + 'a')
    }
    mp[k] = append(mp[k], s)
  }
  var ans [][]string
  for _, v := range mp {
    ans = append(ans, v)
  }
  return ans
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文