leetcode - 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:
    std::vector<int> findSubstring(std::string S, std::vector<std::string> &L) {
		std::vector<int> res;
		if (L.size()==0) return res;
		if (S.size() < L.size()*L[0].size()) return res;

		int wl = L[0].size();
		std::unordered_map<std::string, std::vector<int> > hashLocation;
		std::unordered_map<std::string, std::vector<int> >::iterator hashIt;
		std::unordered_map<std::string, int> hashIndex;
		std::vector<int> empty;
		for (int i=0; i<wl; ++i) { 
			hashLocation.clear();
			for (int k=0; k<L.size(); ++k) {
				if (hashLocation.find(L[k]) == hashLocation.end()) {
					hashLocation[L[k]] = empty;
				}
				hashLocation[L[k]].push_back(-1);
				hashIndex[L[k]] = 0;
			}
			int head=i, curr=i, hitCnt=0;
			while (curr<S.size()) {
				std::string a = S.substr(curr, wl);
				hashIt = hashLocation.find(a);
				if (hashIt==hashLocation.end()) {
					head = curr+wl;
					curr = head;
					hitCnt = 0;
					continue;
				}
				int earliestCur = hashIt->second[hashIndex[a]];
				if (earliestCur < head) {
					hitCnt++;
					if (hitCnt == L.size()) {
						res.push_back(head);
						head += wl;
						hitCnt--;
					}
				} else {
					hitCnt -= (earliestCur-head)/wl;
					head = earliestCur+wl;
				}
				hashIt->second[hashIndex[a]] = curr;
				hashIndex[a] = (hashIndex[a]+1)%hashIt->second.size();
				curr += wl;
			}
		}
		return res;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值