m0_61574664 2022-01-10 15:02 采纳率: 87.1%
浏览 89
已结题

串联所有单词的子串,c++基础题

class Solution {
public:
unordered_map<string, int> words_mp;
int wsize;//单个word的长度
int wordssize;//word的总个数
bool ismatch(const string& s, int index, int num)//回溯匹配函数
{
if (num == wordssize)
{
return true;
}
if (index + wsize > s.size())
{
return false;
}
auto it = words_mp.find(s.substr(index, wsize));
if (it != words_mp.end())
{
if (it->second == 0)
{
return false;
}
--it->second;
if (ismatch(s, index + wsize, num + 1))
{
++it->second;
return true;
}
else
{
++it->second;
return false;
}
}
else
{
return false;
}
}
vector findSubstring(string s, vector& words) {
for (const string& word : words)
{
++words_mp[word];
}
wsize = words[0].size();
wordssize = words.size();
int ssize = s.size() - wsize + 1;
vector ans;
for (int i = 0; i < ssize; ++i)
{
if (ismatch(s, i, 0))
{
ans.push_back(i);
}
}
return ans;
}
};
这是力扣原题中的c++,秦淮孤道的回溯解法,第30道题,解法中c++模块第一个就是,来个认真负责的
问: --it->second;以及++it->second;作者的目的是对已经修改的哈希表进行复原,我看了好久都没有明白为什么要复原,谁能用简单易懂详细的语言解释为什么要复原,如果it->second指向了第一个元素,再减不会溢出吗,这时候计算机是怎么处理的
问:for (const string& word : words) { ++words_mp[word]; }这个哈希表++words_mp[word]; 这个什么意思呢,是将word依次放入哈希表吗,为什么不用put(word[i],i),希望能详细讲解一下,++words_mp[word]; 难道不是words_mp[word]+1吗,为什么。key的值是自动赋予的吗
问: wsize = words[0].size();,这里为什么不考虑words[i]中不同的值得长度不一样,words[0]这里我感觉有错误啊,是我的错了吗,为什么不写成for(int i=0;i++;){word[i].size();}呢,希望能认真解答一下
来个认真负责的大佬

  • 写回答

5条回答 默认 最新

  • _GX_ 2022-01-10 19:56
    关注
    #include <vector>
    #include <string>
    #include <unordered_map>
    
    using namespace std;
    
    
    class Solution
    {
    public:
        unordered_map<string, int> words_mp;              // 记录单词可供匹配的数目,words中可能有重复的单词
        int wsize;                                        // 单个word的长度
        int wordssize;                                    // word的总个数
    
        // s: 字符串
        // index: 子串开始位置
        // num: 已经匹配单词的数目
        bool ismatch(const string &s, int index, int num) // 回溯匹配函数
        {
            if (num == wordssize) // 如果已经匹配单词数目等于words的单词个数,则匹配成功
            {
                return true;
            }
            if (index + wsize > s.size()) // 如果index+wsize大于s.size(),说明从index开始的子串不能匹配words中的任何单词(因为所有单词长度相等),则匹配失败
            {
                return false;
            }
            auto it = words_mp.find(s.substr(index, wsize)); // 在words_mp中查找从index开始长度为wsize的子串
            if (it != words_mp.end()) // 如果找到该子串
            {
                if (it->second == 0) // 但是如果该子串可供匹配数目为0,说明该单词在之前都已经匹配完了(words中单词可能有重复),则匹配失败
                {
                    return false;
                }
                --it->second; // 否则,匹配该单词,让其可供匹配单词数目减1
                if (ismatch(s, index + wsize, num + 1)) // 递归匹配下一个字串,位置从index+wsize开始,已经匹配单词数目为num+1
                {
                    ++it->second; // 恢复单词计数
                    return true;
                }
                else
                {
                    ++it->second; // 恢复单词计数
                    return false;
                }
            }
            else // 如果没有找到该子串,则匹配失败
            {
                return false;
            }
        }
    
        vector findSubstring(string s, vector &words)
        {
            for (const string &word : words)
            {
                ++words_mp[word];      // 统计每个单词数目,注意words里可能有重复的单词
            }
            wsize = words[0].size();   // 题目规定了每个word的长度相等,wsize存储的是单词的长度
            wordssize = words.size();  // wordssize存储的是单词的个数
            int ssize = s.size() - wsize + 1;
            vector ans;
            for (int i = 0; i < ssize; ++i) // 依次对字符串s的每个位置进行匹配检查,由于words里所有单词长度相同,结束条件少一个单词的长度
            {
                if (ismatch(s, i, 0))  // 如果s中从i开始的字串匹配了words所有单词拼接,则存储该下标i到结果中
                {
                    ans.push_back(i);
                }
            }
            return ans;  // 返回所有匹配的下标
        }
    };
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 1月21日
  • 已采纳回答 1月13日
  • 创建了问题 1月10日

悬赏问题

  • ¥500 求华为P30PRO手机硬盘数据恢复
  • ¥15 关于#vscode#的问题:ESP32开发板对接MQTT实现小灯泡的开关
  • ¥15 TMC2209串口模式下读取不到寄存器的值串口助手蓝色字体是发过去的消息,绿色字体是收到的消息,第二行发送读取寄存器的指令但是没有读取到寄存器的值串口助手如下图:接线如下图,如何解决?
  • ¥15 高通安卓11提取完整线刷包软件,或者优博讯dt50顺丰刷机包
  • ¥20 C,有个译码器,换了信道就跑不出原来数据
  • ¥15 MIMIC数据库安装问题
  • ¥60 基于JTag协议开发Fpga下载器上位机,哪位大🐂有偿指导?
  • ¥20 全书网Java爬取数据
  • ¥15 怎么获取红包封面的原始链接,并且获取红包封面序列号
  • ¥100 微信小程序跑脚本授权的问题