当前位置:   article > 正文

Substring with Concatenation of All Words_given a list of words l, that are all the same len

given a list of words l, that are all the same length,andg a string, s, find

题目描述

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;  
    }
};

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/252630?site
推荐阅读
相关标签
  

闽ICP备14008679号