赞
踩
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).
错误代码:
- vector<int> findSubstring(string S, vector<string> &L) {
- // Note: The Solution object is instantiated only once.
- set<string> dic;
- for(int i = 0; i < L.size(); i++)
- dic.insert(L[i]);
-
- vector<int> res;
- int wordlen = L[0].size();
- set<string>::iterator it;
- int i = 0;
- bool isLastOk = false;
- while(i < S.size())
- {
- string sub = S.substr(i,wordlen);
- it = dic.find(sub);
- if(it != dic.end())
- {
- if(!isLastOk)
- {
- res.push_back(i);
- isLastOk = true;
- }
- i += wordlen;
- }else
- {
- isLastOk = false;
- i++;
- }
- }
- return res;
- }

- vector<int> findSubstring(string S, vector<string> &L) {
- // Note: The Solution object is instantiated only once.
- map<string,int> words;
- map<string,int> cur;
- int wordNum = L.size();
- for(int i = 0; i < wordNum; i++)
- words[L[i]]++;
- int wordLen = L[0].size();
- vector<int> res;
- //if(S.size() < wordLen*wordNum)return res;
- for(int i = 0; i <= (int)S.size()-wordLen*wordNum; i++)
- {
- cur.clear();
- int j;
- for(j = 0; j < wordNum; j++)
- {
- string word = S.substr(i+j*wordLen, wordLen);
- if(words.find(word) == words.end())
- break;
- cur[word]++;
- if(cur[word]>words[word])
- break;
- }
- if(j == wordNum)
- res.push_back(i);
- }
- return res;
- }

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