前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Day10-字符串-同字符词语分组

Day10-字符串-同字符词语分组

作者头像
BUPTrenyi
发布2019-07-15 16:54:21
4710
发布2019-07-15 16:54:21
举报

一 今天唠唠嗑

三连冠王朝终于还是难再现了,KD早日康复,明年再来~当然了新王诞生,祝贺~

二 上题!

Q:已知一组字符串,将所有anagram(由颠倒字母顺序而构成的字)放到一起输出。

例如:["eat", "tea", "tan", "ate", "nat", "bat"]

返回:[ ["ate", "eat","tea"], ["nat","tan"], ["bat"] ]

三 冷静分析

首先要知道,输入是一个字符串数组,输出是一个二维字符串数组

那么随即问题来了:

如何建立哈希map,以及怎样设计key与value,就可以将各个字符相同的字符串,映射到一起?

我们要知道,c++标准STL中的vector,即字符串数组vector<string>,支持对每个字符串进行排序,比如“asdf”,排序后就是“adfs”

知道了这一点,是不是有思路了呢

那么,我们可以这样处理逻辑:

建立字符串到字符串数组的哈希map,遍历字符串数组strings中的每一个单词:

如果该单词排序后,从未出现在哈希map中:

设置从该单词到空字符串数组的映射

将该单词添加进哈希map[该单词]中

遍历完所有单词后,遍历哈希map,将value添加进字符串数组result中

即最后的哈希map是:

aet -> [“eat”, “tea”, “ate”]

ant -> [“tan”, “nat”]

abt -> [“bat”]

四 完整代码及十分详细的注释

代码语言:javascript
复制
//
// Created by renyi on 2019-06-14.
//
#include <iostream>
#include <string>
#include <map>
#include <vector>
using namespace std;

vector<vector<string>> groupAnagram(vector<string>& strings){//这个函数,参数是字符串数组,返回类型是二位字符串数组
    map<string, vector<string>> anagram;//初始化一个哈希map,从字符串到字符串数组的映射
    vector<vector<string>> result;//存储最终的结果,即二位字符串数组

    for (int i = 0; i < strings.size(); i++) {//遍历strings里的每个单词
        string str = strings[i];//创建一个临时字符串变量str接收每个单词
        sort(str.begin(), str.end());//对单词进行排序

        if (anagram.find(str) == anagram.end()) {//如果排序后的单词str,不在哈希map里
            vector<string> temp;//创建一个空的字符串数组
            anagram[str] = temp;//以排序后的strings[i]作key
        }
        anagram[str].push_back(strings[i]);//在key对应的value中push当前单词
    }

    map<string, vector<string>> ::iterator it;//初始化一个指向,从字符串string,到字符串数组vector<string>的哈希map的指针it
    for (it = anagram.begin(); it != anagram.end(); it++) {
        result.push_back(it->second);//遍历哈希map:anagram,将其value,push进result
    }
    return result;
}

int main(){
    vector<string> strings;
    strings.emplace_back("nba");
    strings.emplace_back("dog");
    strings.emplace_back("god");
    strings.emplace_back("abn");
    strings.emplace_back("bna");
    strings.emplace_back("bat");
    
    vector<vector<string>> result = groupAnagram(strings);

    for (int i = 0; i < result.size(); i++) {
        for (int j = 0; j < result[i].size(); j++) {
            printf("[%s]", result[i][j].c_str());
        }
        printf("\n");
    }
    return 0;
}

运行结果

五 总结一下

大家应该注意到了,只要理顺逻辑,建立了正确的哈希map,注意临界点与特殊边界,字符串的初级算法问题思路并不是很难的

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法其实很好玩 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
NAT 网关
NAT 网关(NAT Gateway)提供 IP 地址转换服务,为腾讯云内资源提供高性能的 Internet 访问服务。通过 NAT 网关,在腾讯云上的资源可以更安全的访问 Internet,保护私有网络信息不直接暴露公网;您也可以通过 NAT 网关实现海量的公网访问,最大支持1000万以上的并发连接数;NAT 网关还支持 IP 级流量管控,可实时查看流量数据,帮助您快速定位异常流量,排查网络故障。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档