当前位置:   article > 正文

Leetcode题:Substring with Concatenation of All Words_[leetcode] substring with concatenation of all wor

[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).

想法一:假设L中的单位长度为n,依次从S中取长度为n的子串,如果在L中,就记下来。需要借助hash或map,如果整个L都匹配完了,就算是一个concatenation;当匹配错误的时候,S右移一个位置。

想法二:事先把L的所有concatenation组合出来,放到hash或map里,然后遍历S的时候直接看。

下面的代码是实现的第一种想法,第二种想法当L中数据较多时由于组合数会剧增,效率较低。

  1. class Solution {
  2. public:
  3. vector<int> findSubstring(string S, vector<string> &L) {
  4. vector<int> result;
  5. int n = L[0].size();
  6. int len = n * L.size();
  7. if(len > S.size())
  8. return result;
  9. map<string, int> m;
  10. for(int i=0;i<L.size();i++)
  11. m[L[i]]++; // 发现可以不用特意初始化直接开始自增
  12. int idx = 0;
  13. map<string, int> tmp;
  14. while(idx <= S.size() - len)
  15. {
  16. bool flag = true;
  17. tmp.clear();
  18. for(int i=idx;i<=idx+n*(L.size()-1);i+=n)
  19. {
  20. string now = S.substr(i, n);
  21. if(m.find(now) == m.end())
  22. {
  23. flag = false;
  24. break;
  25. }
  26. tmp[now]++;
  27. if(tmp[now] > m[now])
  28. {
  29. flag = false;
  30. break;
  31. }
  32. }
  33. if(flag == true)
  34. result.push_back(idx);
  35. idx++;
  36. }
  37. return result;
  38. }
  39. };


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

闽ICP备14008679号