面试经典150题——Day32

文章目录

一、题目

30. Substring with Concatenation of All Words

You are given a string s and an array of strings words. All the strings of words are of the same length.

A concatenated substring in s is a substring that contains all the strings of any permutation of words concatenated.

For example, if words = "ab","cd","ef", then "abcdef", "abefcd", "cdabef", "cdefab", "efabcd", and "efcdab" are all concatenated strings. "acdbef" is not a concatenated substring because it is not the concatenation of any permutation of words.

Return the starting indices of all the concatenated substrings in s. You can return the answer in any order.

Example 1:

Input: s = "barfoothefoobarman", words = "foo","bar"

Output: 0,9

Explanation: Since words.length == 2 and wordsi.length == 3, the concatenated substring has to be of length 6.

The substring starting at 0 is "barfoo". It is the concatenation of "bar","foo" which is a permutation of words.

The substring starting at 9 is "foobar". It is the concatenation of "foo","bar" which is a permutation of words.

The output order does not matter. Returning 9,0 is fine too.

Example 2:

Input: s = "wordgoodgoodgoodbestword", words = "word","good","best","word"

Output: \[\]

Explanation: Since words.length == 4 and wordsi.length == 4, the concatenated substring has to be of length 16.

There is no substring of length 16 in s that is equal to the concatenation of any permutation of words.

We return an empty array.

Example 3:

Input: s = "barfoofoobarthefoobarman", words = "bar","foo","the"

Output: 6,9,12

Explanation: Since words.length == 3 and wordsi.length == 3, the concatenated substring has to be of length 9.

The substring starting at 6 is "foobarthe". It is the concatenation of "foo","bar","the" which is a permutation of words.

The substring starting at 9 is "barthefoo". It is the concatenation of "bar","the","foo" which is a permutation of words.

The substring starting at 12 is "thefoobar". It is the concatenation of "the","foo","bar" which is a permutation of words.

Constraints:

1 <= s.length <= 104

1 <= words.length <= 5000

1 <= wordsi.length <= 30

s and wordsi consist of lowercase English letters.

题目来源: leetcode

二、题解

滑动窗口

cpp 复制代码
class Solution {
public:
    vector<int> findSubstring(string s, vector<string>& words) {
        vector<int> ans;
        if (words.empty()) return ans;

        int n = s.length(), m = words.size(), w = words[0].length();

        // 记录目标串每个单词应出现的次数
        unordered_map<string, int> total;
        for (int i = 0; i < words.size(); i++) {
            total[words[i]]++;
        }

        for (int i = 0; i < w; i++) {
            unordered_map<string, int> window;
            int cnt = 0;
            for (int j = i; j + w <= n; j += w) {
                // 超过目标串长度,需要去除头部的字符串
                if (j >= i + m * w) {
                    string word = s.substr(j - m * w, w);
                    window[word]--;
                    if (window[word] < total[word]) cnt--;
                }
                // 新增的字符串
                string word = s.substr(j, w);
                window[word]++;
                if (window[word] <= total[word]) cnt++;
                // 完全匹配,添加结果
                if (cnt == m) ans.push_back(j - (m - 1) * w);
            }
        }
        return ans;
    }
};
相关推荐
林爷万福8 小时前
MATLAB光谱数据分析从入门到项目实战
算法·光纤光谱仪
Cosolar8 小时前
深入理解 LangChain Callback 机制:从入门到实战
人工智能·后端·面试
吴可可1238 小时前
AutoCAD2016二次开发环境配置指南
算法·机器学习
一条大祥脚8 小时前
ABC461 枚举|扫描线|动态前缀和|数论|dfs枚举子集
算法·深度优先
计算机安禾8 小时前
【数据库系统原理】第14篇:关系模式的语义约束:函数依赖的公理系统与闭包计算
人工智能·算法·机器学习
MZZ骏马8 小时前
C++ 极简模式的日志
c++
量化君也8 小时前
快速入门量化交易都要学些什么?
大数据·人工智能·python·算法·金融
AbandonForce8 小时前
滑动窗口:定长滑动窗口与不定长滑动窗口
数据结构·c++·算法
炸薯条!8 小时前
二叉树的链式表示(2)
java·数据结构·算法
Tairitsu_H8 小时前
[LC优选算法#2] 滑动窗口 | 长度最小的子数组 | 无重复字符的最长子串 | 最大连续1的个数
算法