• 249. Group Shifted Strings


    问题描述:

    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"]
    ]

    解题思路:

    使用visited函数来判断该字符串是否已经被访问并且加入到某一个组内。

    若加入则跳过

    若未加入,则判断或寻找它的组员

    需要注意的是:

    在判断是否可以通过偏移来获得另一个字符串时,注意当被减数大于减数时如何判断:

     s1[i] - 'a' + ('z' - s2[i]) +1;

    代码:

    class Solution {
    public:
        vector<vector<string>> groupStrings(vector<string>& strings) {
            vector<bool> visited(strings.size(), false);
            vector<vector<string>> ret;
            for(int i = 0; i < strings.size(); i++){
                if(visited[i]) continue;
                visited[i] = true;
                vector<string> cur;
                cur.push_back(strings[i]);
                for(int j = i+1; j < strings.size(); j++){
                    if(visited[j]) continue;
                    if(canShift(strings[i], strings[j])){
                        cur.push_back(strings[j]);
                        visited[j] = true;
                    }
                }
                ret.push_back(cur);
            }        
            return ret;
        }
    private: 
        bool canShift(string s1, string s2){
            if(s1.size() != s2.size()){
                return false;
            }
            if(s1.size() == 1)
                return true;
            int diff = s1[0] >= s2[0] ? s1[0] - s2[0] : s1[0] - 'a' + ('z' - s2[0]) + 1;
            for(int i = 1; i < s1.size(); i++){
                int curdiff = s1[i] >= s2[i] ? s1[i] - s2[i] : s1[i] - 'a' + ('z' - s2[i]) +1;
                if(curdiff != diff)
                    return false;
            }
            return true;
        }
    };
  • 相关阅读:
    电容降压的工作原理与计算
    B站开源ijkplayer 等多个项目
    Kindle支持哪些格式
    PPM格式解析
    YUV RGB播放器 打开, 显示RGB数据
    How to print 如何输出 int64_t,uint64_t的值 in C
    FileSeek文件内容搜索工具下载
    对android录制的NV21视频数据进行旋转(90,180,270)与剪切
    Adobe Flash Media Server安装
    Linux使用du和df查看磁盘和文件夹占用空间
  • 原文地址:https://www.cnblogs.com/yaoyudadudu/p/9241471.html
Copyright © 2020-2023  润新知