1. 程式人生 > >substring-with-concatenation-of-all-words

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

程式:

class Solution {
public:
    vector<int> findSubstring(string S, vector<string> &L) {
        map<string, int> dict;
        vector<int> res;
        if (!S.size() || !L.size())
            return res;
        for (int i = 0; i < L.size(); i++)
            dict[L[i]] ++;

        int
m = L.size(); int n = L[0].size(); int size = m*n; for (int i = 0; i < S.size() - size + 1; i++) { for (int a = 0; a < m; a++)//字典歸0 { dict[L[a]] = 0; } for (int a = 0; a < m; a++)//與上步一起初識化字典 { dict[L[a]] ++; } string
s = S.substr(i, size); int j = 0; while (j < m) { string ss = s.substr(j*n, n); if (dict.find(ss) != dict.end()) dict[ss]--; else break; j++; } if (j != m) continue; int k = 0; for (; k < m; k++) { if (dict[L[k]]) break; } if (k == m) res.push_back(i); } return res; } };

點評:

通過雜湊表減少時間複雜度