您的位置:首页 > 其它

LeetCode | Substring with Concatenation of All Words(链接所有单词的子串)

2014-08-17 20:54 351 查看
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).

题目解析:

这道题纠结了好久……由于对c++不熟悉,一直想用c来实现,结果就太麻烦了,不知道哪位大神用c成功实现,忘分享……

用c++的map就相当容易了,先将L中的字符串在map中建立映射。然后S从前往后一次以某一个为起始字符判断长度为l_size*word_size的连续字符串是否都在map中。当然为了防止L中有重复的字符串出现,另设一个counting,来记录子串的个数,当个数超过word_count[word]的时候,也退出,遍历S中的下一个字符。

class Solution {
public:
vector<int> findSubstring(string S, vector<string> &L) {
int l_size = L.size();
vector<int> res;
if(l_size <= 0)
return res;

map<string,int> word_count; //记录L字符串中每一个元素出现的个数
int word_size = L[0].size();
for(int i = 0;i < l_size;i++)
++word_count[L[i]];
map<string,int> counting;   //记录查找过程中的个数
for(int i = 0;i <= (int)S.size()-l_size*word_size;i++){
counting.clear();
int j;
for(j = 0;j < l_size;j++){
string word = S.substr(i+j*word_size,word_size);
if(word_count.find(word) != word_count.end()){
++counting[word];
if(counting[word] > word_count[word])
break;
}else
break;
}
if(j == l_size)
res.push_back(i);
}
return res;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐