LeetCode 30. Substring with Concatenation of All Words(所有单词的连接)
来源:互联网 发布:java统计报表怎么做 编辑:程序博客网 时间:2024/05/19 02:02
原题网址:https://leetcode.com/problems/substring-with-concatenation-of-all-words/
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 wordsexactly 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).
方法:使用直方图统计。
public class Solution { public List<Integer> findSubstring(String s, String[] words) { Map<String, Integer> histograms = new HashMap<>(); for(String word: words) { Integer count = histograms.get(word); if (count == null) { count = 1; } else { count ++; } histograms.put(word, count); } Map<String, Integer> wordCounts = new HashMap<>(); List<Integer> substrings = new ArrayList<>(); int m = words[0].length(); int n = s.length(); for(int offset = 0; offset < m; offset ++) { int matched = 0; int pos = offset; wordCounts.clear(); for(int i=offset; i+m<=n; i+=m) { String word = s.substring(i, i+m); if (!histograms.containsKey(word)) { wordCounts.clear(); matched = 0; pos = i+m; continue; } Integer count = wordCounts.get(word); if (count == null || count < histograms.get(word)) { matched ++; } if (count == null) { count = 1; } else { count ++; } wordCounts.put(word, count); if (matched == words.length) { substrings.add(pos); } if (pos + (words.length-1)*m <= i) { String prev = s.substring(pos, pos+m); // System.out.printf("removing %s\n", prev); Integer pc = wordCounts.get(prev); if (pc <= histograms.get(prev)) matched --; pc --; wordCounts.put(prev, pc); pos += m; } } } return substrings; }}
另一种实现:
public class Solution { public List<Integer> findSubstring(String s, String[] words) { List<Integer> results = new ArrayList<>(); if (s == null || words == null || words.length == 0) return results; Map<String, Integer> h = new HashMap<>(); for(String word : words) { Integer c = h.get(word); if (c == null) c = 1; else c++; h.put(word, c); } int len = words[0].length(); for(int offset = 0; offset < len; offset++) { Map<String, Integer> f = new HashMap<>(); int from = offset; int count = 0; for(int i = offset; i + len <= s.length(); i += len) { String word = s.substring(i, i + len); Integer hc = h.get(word); if (hc == null) { from = i + len; count = 0; f = new HashMap<>(); continue; } Integer fc = f.get(word); if (fc == null) fc = 1; else fc++; f.put(word, fc); count++; while (fc > hc) { String fword = s.substring(from, from + len); f.put(fword, f.get(fword) - 1); fc = f.get(word); from += len; count--; } if (count == words.length) { results.add(from); } } } return results; }}
0 0
- LeetCode 30. Substring with Concatenation of All Words(所有单词的连接)
- LeetCode|Substring with Concatenation of All Words(所有单词的串联的子字符串)
- LeetCode | Substring with Concatenation of All Words(链接所有单词的子串)
- LeetCode 30. Substring with Concatenation of All Words(单词连接)
- 【LeetCode-面试算法经典-Java实现】【030-Substring with Concatenation of All Words(串联所有单词的子串)】
- LeetCode----30. Substring with Concatenation of All Words(串联所有的words)
- Substring with Concatenation of All Words字符串中找到包含所有单词的子串
- LeetCode: Substring with Concatenation of All Words
- LeetCode : Substring with Concatenation of All Words
- [Leetcode] Substring with Concatenation of All Words
- [LeetCode]Substring with Concatenation of All Words
- LeetCode-Substring with Concatenation of All Words
- [LeetCode] Substring with Concatenation of All Words
- LeetCode:Substring with Concatenation of All Words
- Leetcode: Substring with Concatenation of All Words
- [LeetCode] Substring with Concatenation of All Words
- leetcode Substring with Concatenation of All Words
- leetcode Substring with Concatenation of All Words
- 深入浅出 - Android系统移植与平台开发(十四) - Sensor HAL框架分析之四
- javascript学习之js使用小技巧
- 数据库资源管理器(Oracle Database Resource Manager)
- swift版QQ音乐播放器(二)
- css学习笔记(一)
- LeetCode 30. Substring with Concatenation of All Words(所有单词的连接)
- Eclispse 更换主题Theme
- Codeforces 比赛代码记录及心得
- leetcode 350. Intersection of Two Arrays II
- 推送通知的跳转
- 百度首页(HTML5)
- mono中的内存泄漏和WeakReference(弱引用)的使用
- Andrid5.0新特性——SVG(可缩放矢量图)
- ubuntu 14.04 利用ap-hotspot建立wifi热点失效