# 串联所有单词的子串

<p>给定一个字符串&nbsp;<strong>s&nbsp;</strong>和一些长度相同的单词&nbsp;<strong>words。</strong>找出 <strong>s
    </strong>中恰好可以由&nbsp;<strong>words </strong>中所有单词串联形成的子串的起始位置。</p>
<p>注意子串要与&nbsp;<strong>words </strong>中的单词完全匹配，中间不能有其他字符，但不需要考虑&nbsp;<strong>words&nbsp;</strong>中单词串联的顺序。</p>
<p>&nbsp;</p>
<p><strong>示例 1：</strong></p>
<pre><strong>输入：  s =</strong> &quot;barfoothefoobarman&quot;,<strong>  words = </strong>[&quot;foo&quot;,&quot;bar&quot;]<strong><br />输出：</strong>[0,9]<strong><br />解释：</strong>从索引 0 和 9 开始的子串分别是 &quot;barfoo&quot; 和 &quot;foobar&quot; 。输出的顺序不重要, [9,0] 也是有效答案。</pre>
<p><strong>示例 2：</strong></p>
<pre><strong>输入：  s =</strong> &quot;wordgoodgoodgoodbestword&quot;,<strong>  words = </strong>[&quot;word&quot;,&quot;good&quot;,&quot;best&quot;,&quot;word&quot;]<strong><br />输出：</strong>[]</pre>

以下程序实现了这一功能，请你填补空白处的内容：

```cpp
#include <bits/stdc++.h>
using namespace std;
class Solution
{
public:
	vector<int> findSubstring(string s, vector<string> &words)
	{
		vector<int> res;
		if (s.empty() || words.empty())
		{
			return res;
		}
		unordered_map<string, int> ht;
		for (const auto &w : words)
		{
			ht[w]++;
		}
		int len = words[0].length();
		for (int i = 0, j = 0; i < s.length() - words.size() * len + 1; i++)
		{
			unordered_map<string, int> counting;
			for (j = 0; j < words.size(); j++)
			{
				string word = s.substr(i + j * len, len);
				______________________;
			}
			if (j == words.size())
			{
				res.push_back(i);
			}
		}
		return res;
	}
};
```

## template

```cpp
#include <bits/stdc++.h>
using namespace std;
class Solution
{
public:
	vector<int> findSubstring(string s, vector<string> &words)
	{
		vector<int> res;
		if (s.empty() || words.empty())
		{
			return res;
		}
		unordered_map<string, int> ht;
		for (const auto &w : words)
		{
			ht[w]++;
		}
		int len = words[0].length();
		for (int i = 0, j = 0; i < s.length() - words.size() * len + 1; i++)
		{
			unordered_map<string, int> counting;
			for (j = 0; j < words.size(); j++)
			{
				string word = s.substr(i + j * len, len);
				if (++counting[word] > ht[word])
				{
					break;
				}
			}
			if (j == words.size())
			{
				res.push_back(i);
			}
		}
		return res;
	}
};
```

## 答案

```cpp
if (++counting[word] > ht[word])
{
	break;
}
```

## 选项

### A

```cpp
if (++counting[word] < ht[word])
{
	break;
}
```

### B

```cpp
if (++counting[word] <= ht[word])
{
	continue;
}
```

### C

```cpp
if (++counting[word] <= ht[word])
{
	break;
}
```