1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| import java.util.*
class Solution { fun wordBreak(s: String, wordDict: List<String>): List<String> { val set = wordDict.toHashSet() val dp = getDpState(s, set) val result = mutableListOf<String>() dfs(s, set, s.length, result, dp, Stack()) return result }
private fun getDpState(s: String, wordDict: Set<String>): Array<Boolean> { val n = s.length val state = Array(n + 1) { false } state[0] = true for (i in 1..n) { for (j in 0 until i) { val s2 = s.substring(j, i) if (state[j] && wordDict.contains(s2)) { state[i] = true } } } return state }
private fun dfs(s: String, wordDict: Set<String>, end: Int, result: MutableList<String>, dp: Array<Boolean>, path: Stack<String>) { val prefix = s.substring(0, end) if (wordDict.contains(prefix)) { path.push(prefix) result.add(path.reversed().joinToString(" ")) path.pop() } for (i in 1..end) { if (dp[i]) { val substring = s.substring(i, end) if (wordDict.contains(substring)) { path.push(substring) dfs(s, wordDict, i, result, dp, path) path.pop() } } } } }
|