TGViewer
Swift | LeetCode Swift | LeetCode @easy_swift_task · 1.3K subscribers
Post #1580 76
Задача: 1258. Synonymous Sentences
Сложность: medium

Вам дан список эквивалентных пар строк synonyms, где synonyms[i] = [si, ti] означает, что si и ti являются эквивалентными строками. Вам также дан текст предложения. Верните все возможные синонимичные предложения, отсортированные лексикографически.

Пример:
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"]


👨‍💻 Алгоритм:

1⃣Построить граф синонимов, используя структуру данных, такую как Union-Find или просто с использованием DFS/BFS.

2⃣Пройти по каждому слову в предложении и найти все возможные синонимы.
Сгенерировать все возможные комбинации предложений.

3⃣Отсортировать полученные предложения лексикографически.

😎 Решение:
class Solution {
func generateSentences(_ synonyms: [[String]], _ text: String) -> [String] {
var graph = [String: Set<String>]()

for pair in synonyms {
graph[pair[0], default: Set()].insert(pair[1])
graph[pair[1], default: Set()].insert(pair[0])
}

let words = text.split(separator: " ").map { String($0) }
var synonymGroups = [[String]]()
for word in words {
synonymGroups.append(findSynonyms(graph, word))
}

var sentences = [String]()
var sentence = ""
generate(&sentences, synonymGroups, &sentence, 0)
return sentences.sorted()
}

private func findSynonyms(_ graph: [String: Set<String>], _ word: String) -> [String] {
var synonyms = Set<String>()
var stack = [word]
while !stack.isEmpty {
let w = stack.removeLast()
if synonyms.insert(w).inserted {
for neighbor in graph[w] ?? [] {
stack.append(neighbor)
}
}
}
return Array(synonyms).sorted()
}

private func generate(_ sentences: inout [String], _ groups: [[String]], _ sentence: inout String, _ index: Int) {
if index == groups.count {
sentences.append(sentence.trimmingCharacters(in: .whitespaces))
return
}
for word in groups[index] {
let original = sentence
sentence += " " + word
generate(&sentences, groups, &sentence, index + 1)
sentence = original
}
}
}


Ставь 👍 и забирай 📚 Базу знаний
More from @easy_swift_task
  1. Oct 7, 2026🔥 Скрытые вакансии с удаленной работой для iOS разработчика, которые нигде больше не публ…
  2. Oct 4, 2026Задача: 523. Continuous Subarray Sum Сложность: medium Дан целочисленный массив nums и цел…
  3. Oct 4, 2026Задача: 1329. Sort the Matrix Diagonally Сложность: medium Диагональ матрицы — это диагона…
  4. Oct 3, 2026Задача: 200. Number of Islands Сложность: medium Дана двумерная бинарная сетка размером m…
  5. Oct 2, 2026Задача: 246. Strobogrammatic Number Сложность: easy Дана строка num, представляющая собой…
  6. Sep 29, 2026Задача: 644. Maximum Average Subarray II Сложность: hard Вам дан целочисленный массив nums…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →