串联所有单词的子串,有几个基础问题需要解答

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();}呢,希望能认真解答一下
来个认真负责的大佬

什么基础问题,列举一下啊