码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode 30. Substring with Concatenation of All Words

时间:2017-08-30 14:15:14      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:int   div   cte   bst   code   字符   nbsp   out   without   

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.

For example, given:
s: "barfoothefoobarman"
words: ["foo", "bar"]

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

 

一眼看过去,以为是ac自动机。

后来看题目发现真难懂,看了看网上的解释,懂了。

题目意思转换一下就是求,words里面的单词排列组合成 k 求k 在s中出现的位置。 

比如

"wordgoodgoodgoodbestword"
["word","good","best","good"]

words里面有4个单词,排列组合出24种字符串k。然后找出k在字符串中s出现的位置。

当然写代码时我们不能把24种组合都求出来,可以用map处理嘛。

时间复杂度O(n*m*len(s)) n*m为words中所有单词加起来的长度

class Solution {
public:
    vector<int> findSubstring(string s, vector<string>& words) {
        vector<int> ans;
        int n = words.size();
        if (n == 0) return ans;
        int m = words[0].size();
        unordered_map<string, int> mp;
        for (int i = 0; i < n; ++i) {
            mp[words[i]]++;
        }
        for (int i = 0; i + n*m <= s.size(); ++i) {
            int num = 0;
            unordered_map<string, int> mp2 = mp;
            for (int j = 0; j < n; ++j) {
                string tmp = s.substr(i + j*m, m);
                if (mp2[tmp] > 0) num++;
                mp2[tmp]--;
            }
            if (num != n) continue;
            ans.push_back(i);
        }
        return ans;
    }
};

 

leetcode 30. Substring with Concatenation of All Words

标签:int   div   cte   bst   code   字符   nbsp   out   without   

原文地址:http://www.cnblogs.com/pk28/p/7452631.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!