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

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。