Watch 6 video solutions for Synonymous Sentences, a medium level problem involving Array, Hash Table, String. This walkthrough by Kelvin Chandra has 2,605 views views. Want to try solving it yourself? Practice on FleetCode or read the detailed text solution.
You are given a list of equivalent string pairs synonyms where synonyms[i] = [si, ti] indicates that si and ti are equivalent strings. You are also given a sentence text.
Return all possible synonymous sentences sorted lexicographically.
Example 1:
Input: synonyms = [["happy","joy"],["sad","sorrow"],["joy","cheerful"]], text = "I am happy today but was sad yesterday" Output: ["I am cheerful today but was sad yesterday","I am cheerful today but was sorrow yesterday","I am happy today but was sad yesterday","I am happy today but was sorrow yesterday","I am joy today but was sad yesterday","I am joy today but was sorrow yesterday"]
Example 2:
Input: synonyms = [["happy","joy"],["cheerful","glad"]], text = "I am happy today but was sad yesterday" Output: ["I am happy today but was sad yesterday","I am joy today but was sad yesterday"]
Constraints:
0 <= synonyms.length <= 10synonyms[i].length == 21 <= si.length, ti.length <= 10si != titext consists of at most 10 words.synonyms are unique.text are separated by single spaces.Problem Overview: You are given pairs of synonymous words and a sentence. Replace words with their synonyms to generate every possible sentence variation. The final output must contain all valid sentences sorted lexicographically.
Approach 1: Graph + Backtracking (Time: O(G + S * K^L), Space: O(G + L))
Model synonyms as an undirected graph using a hash table. Each word is a node and each synonym pair forms an edge. Traverse the graph with DFS or BFS to collect all words connected to a given synonym group. While processing the sentence, if a word appears in the graph, replace it with every synonym in its connected component and recursively build sentences using backtracking. This approach directly explores all combinations but repeatedly traverses synonym groups unless cached.
Approach 2: Union-Find + DFS (Time: O(P α(P) + C log C), Space: O(P + C))
Use Union-Find to group synonymous words efficiently. Each pair is unioned so all related words share the same root. After building groups, map each root to a sorted list of synonyms. While constructing sentences, iterate through the input words: if a word belongs to a synonym group, branch into every candidate word from that group and continue recursively using DFS. Sorting each group ensures the final results are generated in lexicographic order without an additional global sort. Union-Find avoids repeated graph traversal and handles large synonym networks efficiently.
Recommended for interviews: Union-Find + DFS is the expected solution. It separates two concerns cleanly: grouping synonyms with Union-Find and generating combinations with DFS. A basic graph + backtracking approach shows you understand the synonym connectivity, but the Union-Find version demonstrates stronger algorithmic design and scales better when the synonym list grows.
| Approach | Time | Space | When to Use |
|---|---|---|---|
| Graph Traversal + Backtracking | O(G + S * K^L) | O(G + L) | Useful when modeling synonym relationships directly as a graph and the synonym network is small. |
| Union-Find + DFS | O(P α(P) + C log C) | O(P + C) | Best general solution. Efficiently groups synonyms and generates combinations in lexicographic order. |