做题记录——哈希表

  • Post author:
  • Post category:其他


1.lc1282:用户分组(2023/2/1)


题目

给你字符串

key



message

,分别表示一个加密密钥和一段加密消息。解密

message

的步骤如下:

  1. 使用

    key

    中 26 个英文小写字母第一次出现的顺序作为替换表中的字母 顺序 。
  2. 将替换表与普通英文字母表对齐,形成对照表。
  3. 按照对照表 替换

    message

    中的每个字母。
  4. 空格

    ' '

    保持不变。
  • 例如,

    key = "

    hap

    p

    y


    bo

    y"

    (实际的加密密钥会包含字母表中每个字母 至少一次),据此,可以得到部分对照表(

    'h' -> 'a'



    'a' -> 'b'



    'p' -> 'c'



    'y' -> 'd'



    'b' -> 'e'



    'o' -> 'f'

    )。

返回解密后的消息。


示例 :

输入:key = "the quick brown fox jumps over the lazy dog", message = "vkbs bs t suepuv"
输出:"this is a secret"
解释:对照表如上图所示。
提取 "the quick brown fox jumps over the lazy dog" 中每个字母的首次出现可以得到替换表。


思路

用哈希表存储替换表,并按表替换message中的字母。

遍历key中的字母,若不为空格且未在哈希表中出现,则将当前字母与cnt作为键值对存入哈希表中。其中cnt的初值为字母a,哈希表中每添加一个键值对,cnt的值就加一。


\


代码

class Solution {
public:
    string decodeMessage(string key, string message) {
        unordered_map<char, char> mp;
        int cnt = 'a';
        for(char& ch : key){
            if(ch != ' '){
                if(!mp.count(ch)){
                    mp[ch] = cnt++;
                }
            }
        }
        for(char& ch : message){
            if(ch != ' '){
                ch = mp[ch];
            }
        }
        return message;
    }
};

2.lc1487:保证文件名唯一


题目

给你一个长度为

n

的字符串数组

names

。你将会在文件系统中创建

n

个文件夹:在第

i

分钟,新建名为

names[i]

的文件夹。

由于两个文件

不能

共享相同的文件名,因此如果新建文件夹使用的文件名已经被占用,系统会以

(k)

的形式为新文件夹的文件名添加后缀,其中

k

是能保证文件名唯一的

最小正整数

返回长度为


n


的字符串数组,其中

ans[i]

是创建第

i

个文件夹时系统分配给该文件夹的实际名称。


示例 :

输入:names = ["pes","fifa","gta","pes(2019)"]
输出:["pes","fifa","gta","pes(2019)"]
解释:文件系统将会这样创建文件名:
"pes" --> 之前未分配,仍为 "pes"
"fifa" --> 之前未分配,仍为 "fifa"
"gta" --> 之前未分配,仍为 "gta"
"pes(2019)" --> 之前未分配,仍为 "pes(2019)"


思路

:用哈希表存储文件名和出现次数。若文件名未出现过,则存入哈希表中;若文件名出现过,则加上(k)后缀,k即哈希表中的该文件名的键对应的值,若加上后缀后文件名还是重复,则k+1,直至文件名唯一,同时将新文件名存入哈希表。


代码

class Solution {
public:
    vector<string> getFolderNames(vector<string>& names) {
        unordered_map<string,int>mp;
        int n = names.size();
        string tmp;
        for(int i = 0; i < n; i++){
            if(mp.count(names[i]) == 0){
                mp[names[i]] = 0;
            }else{
                tmp = names[i];
                while(mp.count(tmp) == 1){
                    mp[names[i]]++;
                    tmp = names[i]+"("+to_string(mp[names[i]])+")";
                }
                names[i] = tmp;
                mp[names[i]] = 0;
            }
        }
        return names;
    }
};



版权声明:本文为m0_72166786原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。