当前位置:   article > 正文

LeetCode | Substring with Concatenation of All Words(链接所有单词的子串)_you are given a string, s, and a list of words, wo

you are given a string, s, and a list of words, words, that are all of the s

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中的下一个字符。

  1. class Solution {
  2. public:
  3. vector<int> findSubstring(string S, vector<string> &L) {
  4. int l_size = L.size();
  5. vector<int> res;
  6. if(l_size <= 0)
  7. return res;
  8. map<string,int> word_count; //记录L字符串中每一个元素出现的个数
  9. int word_size = L[0].size();
  10. for(int i = 0;i < l_size;i++)
  11. ++word_count[L[i]];
  12. map<string,int> counting; //记录查找过程中的个数
  13. for(int i = 0;i <= (int)S.size()-l_size*word_size;i++){
  14. counting.clear();
  15. int j;
  16. for(j = 0;j < l_size;j++){
  17. string word = S.substr(i+j*word_size,word_size);
  18. if(word_count.find(word) != word_count.end()){
  19. ++counting[word];
  20. if(counting[word] > word_count[word])
  21. break;
  22. }else
  23. break;
  24. }
  25. if(j == l_size)
  26. res.push_back(i);
  27. }
  28. return res;
  29. }
  30. };



声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/252600
推荐阅读
相关标签
  

闽ICP备14008679号