30. Substring with Concatenation of All Words
Posted wentiliangkaihua
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了30. 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 words exactly once and without any intervening characters.
Example 1:
Input:
s = "barfoothefoobarman",
words = ["foo","bar"]
Output: [0,9]
Explanation: Substrings starting at index 0 and 9 are "barfoo" and "foobar" respectively.
The output order does not matter, returning [9,0] is fine too.
Example 2:
Input: s = "wordgoodgoodgoodbestword", words = ["word","good","best","word"] Output:[]
public class Solution { public List<Integer> findSubstring(String s, String[] words) { List<Integer> result = new ArrayList<>(); if(s.length() == 0 || words.length == 0) return result; final int wordLength = words[0].length(); final int catLength = wordLength * words.length; if (s.length() < catLength) return result; HashMap<String, Integer> wordCount = new HashMap<>(); for (String word : words) wordCount.put(word, wordCount.getOrDefault(word, 0) + 1); for (int i = 0; i <= s.length() - catLength; ++i) { HashMap<String, Integer> unused = new HashMap<>(wordCount); for (int j = i; j < i + catLength; j += wordLength) { final String key = s.substring(j, j + wordLength); final int pos = unused.getOrDefault(key, -1); if (pos == -1 || pos == 0) break; unused.put(key, pos - 1); if (pos - 1 == 0) unused.remove(key); } if (unused.size() == 0) result.add(i); } return result; } }
注意空s和空words的情况
以上是关于30. Substring with Concatenation of All Words的主要内容,如果未能解决你的问题,请参考以下文章
leetcode 30 Substring with Concatenation of All Words
30. Substring with Concatenation of All Words
30. Substring with Concatenation of All Words
19.1.30 [LeetCode 30] Substring with Concatenation of All Words