当前位置:   article > 正文

【LeetCode】Substring with Concatenation of All Words 解题报告_substring with concatenation of all words 串联所有单词的子

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

【解析】

题意:给定一个字符串S和一个字符串数组L,L中的字符串长度都相等,找出S中所有的子串恰好包含L中所有字符各一次,返回子串的起始位置。

把L转化为一个HashMap<String, Integer>,其value表示L中String的个数,因为L中可能包含相同的字符串。

  1. public class Solution {
  2. public List<Integer> findSubstring(String S, String[] L) {
  3. List<Integer> ans = new ArrayList<Integer>();
  4. if (S.length() < 1 || L.length < 1) return ans;
  5. int len = L[0].length(); //题目说L中每个单词长度一样
  6. //初始化HashMap,注意L中可能包含多个相同的字符串,所以用value表示个数
  7. HashMap<String, Integer> map = new HashMap<String, Integer>();
  8. for (int j = 0; j < L.length; j++) {
  9. if (map.containsKey(L[j])) {
  10. map.put(L[j], map.get(L[j]) + 1);
  11. } else {
  12. map.put(L[j], 1);
  13. }
  14. }
  15. //i的范围很关键,如果直接到S.length()是会超时的
  16. for (int i = 0; i <= S.length() - L.length * len; i++) {
  17. int from = i;
  18. String str = S.substring(from, from + len);
  19. int cnt = 0;
  20. while (map.containsKey(str) && map.get(str) > 0) {
  21. map.put(str, map.get(str) - 1);
  22. cnt++;
  23. from += len;
  24. if (from + len > S.length()) break; //注意越界
  25. str = S.substring(from, from + len);
  26. }
  27. //L中每个单词恰好出现一次,加入到结果集
  28. if (cnt == L.length) {
  29. ans.add(i);
  30. }
  31. //为下一次初始化HashMap
  32. if (cnt > 0) {
  33. map.clear();
  34. for (int j = 0; j < L.length; j++) {
  35. if (map.containsKey(L[j])) {
  36. map.put(L[j], map.get(L[j]) + 1);
  37. } else {
  38. map.put(L[j], 1);
  39. }
  40. }
  41. }
  42. }
  43. return ans;
  44. }
  45. }

这道题的Test Case有点变态,代码改了好多次,各种没有注意到的边边角角。



=====================

Update on 2015/10/28

该题时间要求已变,上述代码会超时,等待后续更高效的解法,也欢迎大家补充好的解法。

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

闽ICP备14008679号