140. Word Break II

선택한 UI 언어에 맞게 문제 텍스트를 러시아어에서 번역합니다. 코드는 변경하지 않습니다.

Дана 문자열 s и словарь строк wordDict. Добавьте пробелы в строку s, чтобы построить предложение, в котором каждое слово является допустимым словом из словаря. return все такие возможные предложения в любом порядке.

Обратите внимание, что одно и то же слово из словаря может использоваться несколько раз при разделении.

예제:

Input: s = "catsanddog", wordDict = ["cat","cats","and","sand","dog"]

Output: ["cats and dog","cat sand dog"]

C# 해법

매칭됨/원본
using System.Collections.Generic;
public class Solution {
    public IList<string> WordBreak(string s, IList<string> wordDict) {
        HashSet<string> wordSet = new HashSet<string>(wordDict);
        List<string> results = new List<string>();
        string currentSentence = string.Empty;
        Backtrack(s, wordSet, currentSentence, results, 0);
        return results;
    }
    private void Backtrack(string s, HashSet<string> wordSet,
                           string currentSentence, IList<string> results,
                           int startIndex) {
        if (startIndex == s.Length) {
            results.Add(currentSentence);
            return;
        }
        for (int endIndex = startIndex + 1; endIndex <= s.Length; endIndex++) {
            string word = s.Substring(startIndex, endIndex - startIndex);
            if (wordSet.Contains(word)) {
                string originalSentence = currentSentence;
                if (!string.IsNullOrEmpty(currentSentence)) currentSentence += " ";
                currentSentence += word;
                Backtrack(s, wordSet, currentSentence, results, endIndex);
                currentSentence = originalSentence;
            }
        }
    }
}

C++ 해법

자동 초안, 제출 전 검토
#include <bits/stdc++.h>
using namespace std;

// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
    public vector<string> WordBreak(string s, vector<string> wordDict) {
        HashSet<string> wordSet = new HashSet<string>(wordDict);
        List<string> results = new List<string>();
        string currentSentence = string.Empty;
        Backtrack(s, wordSet, currentSentence, results, 0);
        return results;
    }
    private void Backtrack(string s, HashSet<string> wordSet,
                           string currentSentence, vector<string> results,
                           int startIndex) {
        if (startIndex == s.size()) {
            results.push_back(currentSentence);
            return;
        }
        for (int endIndex = startIndex + 1; endIndex <= s.size(); endIndex++) {
            string word = s.Substring(startIndex, endIndex - startIndex);
            if (wordSet.Contains(word)) {
                string originalSentence = currentSentence;
                if (!string.IsNullOrEmpty(currentSentence)) currentSentence += " ";
                currentSentence += word;
                Backtrack(s, wordSet, currentSentence, results, endIndex);
                currentSentence = originalSentence;
            }
        }
    }
}

Java 해법

매칭됨/원본
class Solution {

    public List<String> wordBreak(String s, List<String> wordDict) {
        Set<String> wordSet = new HashSet<>(wordDict);
        List<String> results = new ArrayList<>();
        backtrack(s, wordSet, new StringBuilder(), results, 0);
        return results;
    }

    private void backtrack(
        String s,
        Set<String> wordSet,
        StringBuilder currentSentence,
        List<String> results,
        int startIndex
    ) {
        if (startIndex == s.length()) {
            results.add(currentSentence.toString().trim());
            return;
        }

        for (int endIndex = startIndex + 1; endIndex <= s.length(); endIndex++) {
            String word = s.substring(startIndex, endIndex);
            if (wordSet.contains(word)) {
                int currentLength = currentSentence.length();
                currentSentence.append(word).append(" ");
                backtrack(s, wordSet, currentSentence, results, endIndex);
                currentSentence.setLength(currentLength);
            }
        }
    }
}

JavaScript 해법

매칭됨/원본
class Solution {
    wordBreak(s, wordDict) {
        const wordSet = new Set(wordDict);
        const results = [];
        this._backtrack(s, wordSet, [], results, 0);
        return results;
    }

    _backtrack(s, wordSet, currentSentence, results, startIndex) {
        if (startIndex === s.length) {
            results.push(currentSentence.join(" "));
            return;
        }

        for (let endIndex = startIndex + 1; endIndex <= s.length; endIndex++) {
            const word = s.substring(startIndex, endIndex);
            if (wordSet.has(word)) {
                currentSentence.push(word);
                this._backtrack(s, wordSet, currentSentence, results, endIndex);
                currentSentence.pop();
            }
        }
    }
}

Python 해법

매칭됨/원본
class Solution:
    def wordBreak(self, s: str, wordDict: List[str]) -> List[str]:
        word_set = set(wordDict)
        results = []
        self._backtrack(s, word_set, [], results, 0)
        return results

    def _backtrack(self, s: str, word_set: set, current_sentence: List[str], results: List[str], start_index: int):
        if start_index == len(s):
            results.append(" ".join(current_sentence))
            return

        for end_index in range(start_index + 1, len(s) + 1):
            word = s[start_index:end_index]
            if word in word_set:
                current_sentence.append(word)
                self._backtrack(s, word_set, current_sentence, results, end_index)
                current_sentence.pop()

Go 해법

매칭됨/원본
package main

import (
  "strings"
)

func wordBreak(s string, wordDict []string) []string {
  wordSet := make(map[string]struct{})
  for _, word := range wordDict {
    wordSet[word] = struct{}{}
  }
  var results []string
  backtrack(s, wordSet, "", &results, 0)
  return results
}

func backtrack(s string, wordSet map[string]struct{}, currentSentence string, results *[]string, startIndex int) {
  if startIndex == len(s) {
    *results = append(*results, currentSentence)
    return
  }

  for endIndex := startIndex + 1; endIndex <= len(s); endIndex++ {
    word := s[startIndex:endIndex]
    if _, exists := wordSet[word]; exists {
      originalSentence := currentSentence
      if len(currentSentence) > 0 {
        currentSentence += " "
      }
      currentSentence += word
      backtrack(s, wordSet, currentSentence, results, endIndex)
      currentSentence = originalSentence
    }
  }
}

func main() {
  s := "leetcode"
  wordDict := []string{"leet", "code"}
  results := wordBreak(s, wordDict)
  for _, result := range results {
    println(result)
  }
}

Algorithm

1️⃣

Инициализация и начальный вызов:

Преобразуйте 배열 wordDict в множество wordSet для эффективного поиска.

Инициализируйте пустой 배열 results для хранения допустимых предложений.

Инициализируйте пустую строку currentSentence для отслеживания конструируемого предложения.

Вызовите функцию backtrack с исходной строкой s, множеством wordSet, текущим предложением currentSentence, 배열ом результатов results и начальным индексом, установленным в 0 — начало 입력ной строки.

return results после завершения работы backtrack.

2️⃣

Функция backtrack:

Базовый случай: Если startIndex равен длине строки, добавьте currentSentence в results и returnсь, так как это означает, что currentSentence представляет собой допустимое предложение.

Итерация по возможным значениям endIndex от startIndex + 1 до конца строки.

3️⃣

Обработка и рекурсия:

Извлеките подстроку word от startIndex до endIndex - 1.

Если word найдено в wordSet:

Сохраните текущее значение currentSentence в originalSentence.

Добавьте word к currentSentence (с пробелом, если это необходимо).

Рекурсивно вызовите backtrack с обновленным currentSentence и endIndex.

Сбросьте currentSentence к его исходному значению (originalSentence) для отката и попробуйте следующий endIndex.

returnсь из функции backtrack.

😎

Vacancies for this task

활성 채용 with overlapping task tags are 표시됨.

전체 채용
아직 활성 채용이 없습니다.