int word_len = words[0].size(); int num_words = words.size(); int total_len = word_len * num_words; int n = s.size();
unordered_map<string, int> word_count; for (auto &w : words) word_count[w]++;
for (int i = 0; i < word_len; ++i) { //0..word_len防止漏掉 int left = i, right = i; unordered_map<string, int> curr_count; while (right + word_len <= n) { string word = s.substr(right, word_len); right += word_len; if (word_count.count(word)) { curr_count[word]++; // 如果某个单词出现次数超过要求,需要收缩左边窗口 while (curr_count[word] > word_count[word]) { string left_word = s.substr(left, word_len); curr_count[left_word]--; left += word_len; } // 检查窗口是否满足总长度 if (right - left == total_len) { result.push_back(left); } } else { // 遇到不在 words 的单词,重置窗口 curr_count.clear(); left = right; } } }