Leetcode 49. 字母异位词分组

Leetcode 49. 字母异位词分组

1、问题分析

题目链接:https://leetcode-cn.com/problems/group-anagrams/

具体思路是:
1、先将取出的字符排序
2、然后在key数组中查找排序后的字符
a、如果找不到,则新建一个 vector<string> ,将排序前的字符插入 vector<string> 数组同时将 vector<string> 添加到结果数组
b、如果查找到,则根据数组index 下标,从结果数组中取出 vector<string>
将排序前的字符插入 vector<string>

  代码我已经进行了详细的注释,理解应该没有问题,读者可以作为参考,如果看不懂(可以多看几遍),欢迎留言哦!我看到会解答一下。

2、问题解决

  笔者以C++方式解决。

#include "iostream"

using namespace std;

#include "algorithm"
#include "vector"
#include "queue"
#include "set"
#include "map"
#include "string"
#include "stack"

class Solution {
private:
    // 结果数组
    vector<vector<string>> result;
    // 以排序后的字符串作为 结果数组 的隐藏 key
    // key_vec 保存所有的 key,即 key数组
    vector<string> key_vec;
public:
    vector<vector<string>> groupAnagrams(vector<string> &strs) {
        // 如果字符串数组为空,直接返回空数组
        if (strs.empty()) {
            return result;
        }
        dealChen(strs);
        return result;
    }

    /**
     * 具体思路是:
     * 1、先将取出的字符排序
     * 2、然后在key数组中查找排序后的字符
     *      a、如果找不到,则新建一个 vector<string> ,将排序前的字符插入 vector<string>  数组
     *          同时将 vector<string> 添加到结果数组
     *      b、如果查找到,则根据数组 index 下标,从结果数组中取出 vector<string> ,
     *          将排序前的字符插入 vector<string>
     *
     * @param strs
     */
    void dealChen(vector<string> &strs) {
        for (int i = 0; i < strs.size(); ++i) {
            // 获取排序前的字符串,因为 sort 函数会修改原字符串
            // 所以这里在临时节点上操作
            string temp = strs[i];
            // 排序字符串
            sort(temp.begin(), temp.end());
            int j = 0;
            // 在 key数组中查找该排序后的字符串
            for (; j < key_vec.size(); ++j) {
                if (key_vec[j] == temp) {
                    break;
                }
            }
            // 如果没有找到
            if (j >= key_vec.size()) {
                // 将 该排序后的字符串作为 key 插入 key 数组
                key_vec.push_back(temp);
                // 新建一个 vector<string> 变量
                vector<string> temp_chen;
                // 将排序前字符串插入 vector<string> 变量
                temp_chen.push_back(strs[i]);
                // 将 vector<string> 变量插入到结果数组
                result.push_back(temp_chen);
            } else {
                // 将排序前的字符串插入查找到的 vector<string> 变量
                result[j].push_back(strs[i]);
            }
        }
    }
};

int main() {
    vector<string> strs = {"eat", "tea", "tan", "ate", "nat", "bat"};
    Solution *pSolution = new Solution;
    auto vector1 = pSolution->groupAnagrams(strs);

    for (int i = 0; i < vector1.size(); ++i) {
        for (int j = 0; j < vector1[i].size(); ++j) {
            cout << vector1[i][j] << " ";
        }
        cout << endl;
    }

    system("pause");
    return 0;
}

运行结果

在这里插入图片描述

有点菜,有时间再优化一下。

3、总结

  难得有时间刷一波LeetCode, 这次做一个系统的记录,等以后复习的时候可以有章可循,同时也期待各位读者给出的建议。算法真的是一个照妖镜,原来感觉自己也还行吧,但是算法分分钟教你做人。前人栽树,后人乘凉。在学习算法的过程中,看了前辈的成果,受益匪浅。
感谢各位前辈的辛勤付出,让我们少走了很多的弯路!
哪怕只有一个人从我的博客受益,我也知足了。
点个赞再走呗!欢迎留言哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值