[leetcode] 30. Substring with Concatenation of All Words

441 篇文章 0 订阅
284 篇文章 0 订阅

Description

You are given a string, s, and a list of words, words, that are all of the same length. Find all starting indices of substring(s) in s that is a concatenation of each word in words exactly once and without any intervening characters.

Example 1:

Input:

  s = "barfoothefoobarman",
  words = ["foo","bar"]

Output:

[0,9]

Explanation:

Substrings starting at index 0 and 9 are "barfoor" and "foobar" respectively.
The output order does not matter, returning [9,0] is fine too.

Example 2:

Input:

  s = "wordgoodgoodgoodbestword",
  words = ["word","good","best","word"]

Output:

[]

分析

题目的意思是:串联所有单词的子串.

  • 只需要两个map就行了,其中一个map1记录每个单词的频率,然后遍历原字符串,由于单词是固定长度的,所以每次截取固定长度的单词,判断其是否在map1中,如果在,判断其是否有重复,所有第二个map2的作用就来了,用map2来记录其统计我们匹配的每个单词的频率,这样可以判断是否有重复,map2上的每个单词都在map1中,且不重复,这样就可以得到符合要求的子字符串的起始位置。

代码

class Solution {
public:
    vector<int> findSubstring(string s, vector<string>& words) {
        vector<int> res;
        if(s.empty()||words.empty()){
            return res;
        }
        int m=words.size();
        int n=words[0].size();
        unordered_map<string,int> m1;
        for(auto word:words){
            m1[word]++;
        }
        int len=s.length();
        for(int i=0;i<=len-m*n;i++){
            unordered_map<string,int> m2;
            int j=0;
            for(;j<m;j++){
                string t=s.substr(i+j*n,n);
                if(m1.find(t)==m1.end()){
                    break;
                }
                m2[t]++;
                if(m2[t]>m1[t]){
                    break;
                }
            }
            if(j==m){
                res.push_back(i);
            }
        }
        return res;
    }
};

参考文献

[编程题]substring-with-concatenation-of-all-words
[LeetCode] Substring with Concatenation of All Words 串联所有单词的子串

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

农民小飞侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值