Leetcode Top Interview โœจ
GithubLinkedinXOfficial Website
  • Leetcode Top Interview ๐ŸŽฏ
  • Guide to Calculating Algorithm Complexity ๐Ÿš€
  • Topic 1 Array - String
    • 88. Merge Sorted Arrays ๐Ÿงฉ
    • 27. Remove Element ๐Ÿงน
    • 26. Remove Duplicates from Sorted Array ๐Ÿšซ
    • 80. Remove Duplicates from Sorted Array II ๐Ÿšซ๐Ÿšซ
    • 169. Majority Element ๐Ÿ‘‘
    • 189. Rotate Array ๐Ÿ”„
    • 121. Best Time to Buy and Sell Stock ๐Ÿ“ˆ
    • 122. Best Time to Buy and Sell Stock II ๐Ÿ“ˆ๐Ÿ’ฐ
    • 55. Jump Game ๐Ÿƒโ€โ™‚๏ธ
    • 45. Jump Game II ๐Ÿƒโ€โ™‚๏ธ
    • 274. H-Index ๐Ÿ“Š
    • 380. Insert Delete GetRandom O(1) ๐ŸŽฒ
    • 238. Product of Array Except Self ๐Ÿ”„
    • 134. Gas Station โ›ฝ
    • 135. Candy ๐Ÿฌ
    • 42. Trapping Rain Water ๐ŸŒง๏ธ
    • 13. Roman to Integer ๐Ÿ”ข
    • 018 Integer to Roman
    • 58. Length of Last Word ๐Ÿ” 
    • 14. Longest Common Prefix ๐ŸŒฑ
    • 151. Reverse Words in a String ๐Ÿ”„
    • 6. Zigzag Conversion ๐Ÿ”€
    • 28. Find the Index of the First Occurrence in a String ๐Ÿ”„
    • 68. Text Justification ๐Ÿ”„
  • Topic 2 Two Pointers
    • 125. Valid Palindrome ๐Ÿšฆ
    • 392. Is Subsequence ๐Ÿ“
    • 167. Two Sum II - Input Array Is Sorted ๐Ÿ”
    • 11. Container With Most Water ๐Ÿž๏ธ
    • 15. 3Sum ๐ŸŒ
  • Topic 3 Sliding Window
    • 209. Minimum Size Subarray Sum ๐ŸŒ
    • 3. Longest Substring Without Repeating Characters ๐ŸŒ
    • 30. Substring with Concatenation of All Words ๐ŸŒ
    • 76. Minimum Window Substring ๐ŸŒ
  • Topic 4 Matrix
    • 36. Valid Sudoku ๐ŸŒ
    • 54. Spiral Matrix ๐ŸŒ
    • 48. Rotate Image ๐Ÿ”„
    • 73. Set Matrix Zeroes
    • 289. Game of Life ๐Ÿ–ผ๏ธ
  • Topic 5 Hashmap
    • 383. Ransom Note ๐Ÿ”
    • 205. Isomorphic Strings ๐Ÿ”
    • 290. Word Pattern ๐Ÿงฉ
    • 242. Valid Anagram ๐ŸŽข
    • 49. Group Anagrams ๐Ÿคนโ€โ™‚๏ธ
    • 1. Two Sum ๐Ÿ”
    • 202. Happy Number ๐Ÿคฉ
    • 219. Contains Duplicate II ๐Ÿ”
    • 128. Longest Consecutive Sequence ๐Ÿ”
  • Topic 6 Intervals
    • 228. Summary Ranges ๐Ÿ“Š
    • 56. Merge Intervals ๐Ÿ”€
    • 57. Insert Interval ๐Ÿ†•
    • 452. Minimum Number of Arrows to Burst Balloons ๐ŸŽˆ
  • Topic 7 Stack
    • 20. Valid Parentheses ๐Ÿ”
    • 71. Simplify Path ๐Ÿ—บ๏ธ
    • 155. Min Stack ๐Ÿ—ƒ๏ธ
    • 150. Evaluate Reverse Polish Notation ๐Ÿง ๐Ÿ’ป
    • 224. Basic Calculator ๐Ÿงฎ
  • Topic 8 Linked List
    • 141. Linked List Cycle ๐Ÿ”
    • 2. Add Two Numbers ๐Ÿ”ข
    • 21. Merge Two Sorted Lists ๐Ÿ”—
    • 138. Copy List with Random Pointer ๐Ÿ”—
    • 92. Reverse Linked List II ๐Ÿ”„
      • Letโ€™s explain step by step ๐Ÿ‡
    • 25. Reverse Nodes in k-Group ๐Ÿ”„
    • 19. Remove Nth Node From End of List ๐Ÿ—‘๏ธ
    • 82. Remove Duplicates from Sorted List II โŒ๐Ÿ”ข
    • 61. Rotate List ๐Ÿ”„
    • 86. Partition List ๐Ÿ”—
    • 146. LRU Cache ๐Ÿ”—
  • Topic 9 Binary Tree General
    • 104. Maximum Depth of Binary Tree ๐Ÿ”—
    • 100. Same Tree ๐Ÿ”—
    • 226. Invert Binary Tree ๐Ÿ”—
    • 101. Symmetric Tree ๐Ÿ”—
    • 105. Construct Binary Tree from Preorder and Inorder Traversal ๐Ÿ”—
    • 106. Construct Binary Tree from Inorder and Postorder Traversal ๐Ÿ”—
    • 117. Populating Next Right Pointers in Each Node II ๐Ÿ”—
    • 114. Flatten Binary Tree to Linked List ๐Ÿ”—
    • 112. Path Sum ๐Ÿ”—
    • 129. Sum Root to Leaf Numbers ๐Ÿ”—
      • What_is_DFS
    • 124. Binary Tree Maximum Path Sum ๐Ÿ”—
Powered by GitBook
On this page
  • Problem Statement ๐Ÿ“œ
  • Examples ๐ŸŒŸ
  • Constraints โš™๏ธ
  • Solution ๐Ÿ’ก
  • Java Solution
  • Time Complexity โณ
  • Space Complexity ๐Ÿ’พ

Was this helpful?

  1. Topic 3 Sliding Window

30. Substring with Concatenation of All Words ๐ŸŒ

Previous3. Longest Substring Without Repeating Characters ๐ŸŒNext76. Minimum Window Substring ๐ŸŒ

Last updated 5 months ago

Was this helpful?

Difficulty: Hard - Tags: String, Hash Table, Sliding Window

Problem Statement ๐Ÿ“œ

You are given a string s and an array of strings words. All the strings of words are of the same length.

A concatenated string is a string that exactly contains all the strings of any permutation of words concatenated.

Return an array of the starting indices of all the concatenated substrings in s. You can return the answer in any order.

Examples ๐ŸŒŸ

๐Ÿ”น Example 1:

Input:

s = "barfoothefoobarman"
words = ["foo","bar"]

Output:

[0,9]

Explanation:

  • The substring starting at 0 is "barfoo". It is the concatenation of ["bar","foo"] which is a permutation of words.

  • The substring starting at 9 is "foobar". It is the concatenation of ["foo","bar"] which is a permutation of words.

๐Ÿ”น Example 2:

Input:

s = "wordgoodgoodgoodbestword"
words = ["word","good","best","word"]

Output:

[]

Explanation: There is no concatenated substring.

๐Ÿ”น Example 3:

Input:

s = "barfoofoobarthefoobarman"
words = ["bar","foo","the"]

Output:

[6,9,12]

Explanation:

  • The substring starting at 6 is "foobarthe". It is the concatenation of ["foo","bar","the"].

  • The substring starting at 9 is "barthefoo". It is the concatenation of ["bar","the","foo"].

  • The substring starting at 12 is "thefoobar". It is the concatenation of ["the","foo","bar"].

Constraints โš™๏ธ

  • 1 <= s.length <= 10^4

  • 1 <= words.length <= 5000

  • 1 <= words[i].length <= 30

  • s and words[i] consist of lowercase English letters.

Solution ๐Ÿ’ก

To solve this problem, we can use a Sliding Window approach with a Hash Table to keep track of the count of each word in words.

  1. Calculate Word Lengths:

    • Since all words in words are the same length, we can calculate the total length of concatenated words and use it to limit our sliding window.

  2. Create a Dictionary for Words:

    • Create a wordCount dictionary to count occurrences of each word in words.

  3. Slide Over Substrings:

    • Use a sliding window approach across s, iterating for each possible starting position to cover all possible concatenations.

    • For each substring in the current window, check if it matches the count in wordCount.

  4. Verify and Store Results:

    • If the substring contains all words with matching frequencies, store the starting index.

Java Solution

import java.util.*;

class Solution {

    public List<Integer> findSubstring(String s, String[] words) {
        // Map to store the frequency of each word in `words`
        Map<String, Integer> wordCount = new HashMap<>();

        for (String word : words) {
            wordCount.merge(word, 1, Integer::sum);
        }

        int strLength = s.length();
        int wordsCount = words.length;
        int wordLength = words[0].length();
        List<Integer> indices = new ArrayList<>();

        // Iterate over possible start indices within a word length
        for (int i = 0; i < wordLength; i++) {

            Map<String, Integer> currentCount = new HashMap<>();
            int left = i, right = i;
            int totalWords = 0;

            // Slide the window through the string
            while (right + wordLength <= strLength) {
                // Extract the current word from the string
                String sub = s.substring(right, right + wordLength);
                right += wordLength;
                // If the word is not in `wordCount`, reset the window
                if (!wordCount.containsKey(sub)) {
                    currentCount.clear();
                    left = right;
                    totalWords = 0;
                    continue;
                }

                // Increment the count of the current word in `currentCount`
                currentCount.merge(sub, 1, Integer::sum);
                ++totalWords;

                // If a word's count exceeds the allowed frequency, shrink the window
                while (currentCount.get(sub) > wordCount.get(sub)) {
                    String removed = s.substring(left, left + wordLength);
                    left += wordLength;
                    currentCount.merge(removed, -1, Integer::sum);
                    --totalWords;
                }

                // If the window contains all words exactly once, record the starting index
                if (totalWords == wordsCount) {
                    indices.add(left);
                }
            }
        }
        return indices; // Return the list of starting indices
    }
}

Time Complexity โณ

  • O(N * M): Where N is the length of s and M is the total length of the words in words. We check each possible substring of length totalLength in s.

Space Complexity ๐Ÿ’พ

  • O(W): Where W is the number of unique words in words, for storing them in wordCount and seenWords hash maps.

You can find the full solution and another solution but it Time Limit Exceeded ๐Ÿ˜ข.

LeetCode Problem Link
here
here