Leetcode题:Substring with Concatenation of All Words

来源:互联网 发布:高频交易软件系统 编辑:程序博客网 时间:2024/06/05 23:48

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).

想法一:假设L中的单位长度为n,依次从S中取长度为n的子串,如果在L中,就记下来。需要借助hash或map,如果整个L都匹配完了,就算是一个concatenation;当匹配错误的时候,S右移一个位置。

想法二:事先把L的所有concatenation组合出来,放到hash或map里,然后遍历S的时候直接看。

下面的代码是实现的第一种想法,第二种想法当L中数据较多时由于组合数会剧增,效率较低。

class Solution {public:    vector<int> findSubstring(string S, vector<string> &L) {                vector<int> result;        int n = L[0].size();        int len = n * L.size();        if(len > S.size())            return result;                map<string, int> m;        for(int i=0;i<L.size();i++)            m[L[i]]++; // 发现可以不用特意初始化直接开始自增                    int idx = 0;        map<string, int> tmp;        while(idx <= S.size() - len)        {            bool flag = true;            tmp.clear();            for(int i=idx;i<=idx+n*(L.size()-1);i+=n)            {                string now = S.substr(i, n);                if(m.find(now) == m.end())                {                    flag = false;                    break;                }                tmp[now]++;                if(tmp[now] > m[now])                {                    flag = false;                    break;                }            }                        if(flag == true)                result.push_back(idx);                            idx++;        }        return result;    }};


0 0
原创粉丝点击