30. Substring with Concatenation of All Words
2016-12-31 19:03
211 查看
You are given a string, s, and a list of words, words, that are all of the same length. Find all starting indices of substring(s) in s that is a concatenation of each word in words exactly once and without any intervening characters.
For example, given:
s: “barfoothefoobarman”
words: [“foo”, “bar”]
You should return the indices: [0,9].
(order does not matter).
一刷没ac
解题思路:刚开始暴力搜索每个定长字符串内是否由字典中每个字符串一次拼接而成,结果TLE,看到别人类似滑动窗口的做法,优化到线性时间,留坑后面总结滑动窗口类型问题。
TLE
AC解
For example, given:
s: “barfoothefoobarman”
words: [“foo”, “bar”]
You should return the indices: [0,9].
(order does not matter).
一刷没ac
解题思路:刚开始暴力搜索每个定长字符串内是否由字典中每个字符串一次拼接而成,结果TLE,看到别人类似滑动窗口的做法,优化到线性时间,留坑后面总结滑动窗口类型问题。
TLE
public class Solution { public List<Integer> findSubstring(String s, String[] words) { List<Integer> res = new ArrayList<Integer>(); if(s == null || s.length() == 0 || words == null || words.length == 0) return res; HashMap<String, Integer> map = new HashMap<String, Integer>(); for(String str : words){ if(map.containsKey(str)){ map.put(str, map.get(str)+1); }else map.put(str, 1); } int len = words.length; int wordlen = words[0].length(); for(int i = 0; i <= s.length()-len*wordlen; i++){ String str = s.substring(i, i+len*wordlen); HashMap<String, Integer> copy = new HashMap<String, Integer>(map); for(int j = 0; j < len; j++){ String tmp = str.substring(j*wordlen, (j+1)*wordlen); if(copy.containsKey(tmp)){ copy.put(tmp, copy.get(tmp)-1); if(copy.get(tmp) == 0) copy.remove(tmp); }else break; } if(copy.size() == 0) res.add(i); } return res; } }
AC解
public class Solution { public List<Integer> findSubstring(String s, String[] words) { List<Integer> res = new ArrayList<>(); Map<String, Integer> baseMap = new HashMap<>(); for (String word : words) { if(baseMap.containsKey(word)) baseMap.put(word, baseMap.get(word)+1); else baseMap.put(word, 1); } int length = words[0].length(); for (int i = 0; i < length; i++) { int left = i, right = left, counter = words.length; Map<String, Integer> map = new HashMap<>(baseMap); while (right + length <= s.length()) { String sub = s.substring(right, right + length); right += length; if(map.containsKey(sub)){ int cnt = map.get(sub); if(cnt-- > 0) counter--; map.put(sub, cnt); } if (counter == 0) { res.add(left); } if (right - left == words.length * length) { sub = s.substring(left, left + length); left += length; if(map.containsKey(sub)){ int cnt = map.get(sub); if (cnt++ >= 0 && cnt <= baseMap.get(sub)) counter++; map.put(sub, cnt); } } } } return res; } }
相关文章推荐
- LeetCode 30. Substring with Concatenation of All Words(所有单词的连接)
- leetcode 30. Substring with Concatenation of All Words
- LeetCode 30. Substring with Concatenation of All Words
- 30. Substring with Concatenation of All Words
- leetCode(30) - Substring with Concatenation of All Words
- (Java) LeetCode 30. Substring with Concatenation of All Words —— 与所有单词相关联的字串
- leetcode-30. Substring with Concatenation of All Words
- LeetCode 30 Substring with Concatenation of All Words 解法为Hashmap
- 【LeetCode】30. Substring with Concatenation of All Words
- 30. Substring with Concatenation of All Words
- leetcode 30. Substring with Concatenation of All Words
- 30.Substring with Concatenation of All Words
- Leetcode 30 Substring with Concatenation of All Words 无序map的应用细节
- LeetCode 30 Substring with Concatenation of All Words(与所有文字串联子串)(*)
- [leetcode 30] Substring with Concatenation of All Words
- LeetCode(30)--Substring with Concatenation of All Words
- 30. Substring with Concatenation of All Words
- [Leetcode]_30 Substring with Concatenation of All Words
- LeetCode 30 - Substring with Concatenation of All Words
- leetcode 30. Substring with Concatenation of All Words