Substring with Concatenation of All Words

题目描述

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

For example, given:
S:"barfoothefoobarman"
L:["foo", "bar"]

You should return the indices:[0,9].
(order does not matter).

题意:

给一个字符串 S 和一个单词列表,单词长度都一样,找出所有 S 的子串,子串由所有单词组成,返回子串的起始位置。

分析:

很明显每个子串都是由所有单词组成的,长度是一定的,所以直接枚举子串,切分后再用 map 进行判断就行了。

实现代码:

             class Solution {
public:
    vector<int> findSubstring(string S, vector<string> &L) {
        map<string, int> words;  
        map<string, int> curWords;  
        vector<int> ret;  
        int slen = S.length();  
        if (!slen || L.empty()) return ret;  
        int llen = L.size(), wlen = L[0].length();  
        for(int i=0;i<L.size();i++)  
//计算字符串对应的key值
            ++words[L[i]];   
        // check the [llen * wlen] substring  
        for (int i = 0; i + llen * wlen <= slen; i++) 
        {  
            curWords.clear();  
            int j = 0;  
            // check the words  
            for (j = 0; j < llen; j++) 
            {  
                string tmp = S.substr(i + j * wlen, wlen);  
                if (words.find(tmp) == words.end())  
                    break;  
                ++curWords[tmp];  
                if (curWords[tmp] > words[tmp])  //防止S中重复单词出现
                    break;  
            }  
            if (j == llen)  //从i位置已经找到了L中的单词;
                ret.push_back(i);  
        }  
        return ret;  
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值