go: add «131. Palindrome Partitioning»
Signed-off-by: Matej Focko <me@mfocko.xyz>
This commit is contained in:
parent
370c61deb6
commit
98209ffa96
1 changed files with 67 additions and 0 deletions
67
go/palindrome-partitioning.go
Normal file
67
go/palindrome-partitioning.go
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
package palindrome_partitioning
|
||||||
|
|
||||||
|
import (
|
||||||
|
"slices"
|
||||||
|
)
|
||||||
|
|
||||||
|
func getPalindromes(s string) [][]bool {
|
||||||
|
size := len(s) + 1
|
||||||
|
|
||||||
|
// Create a DP table
|
||||||
|
palindromes := make([][]bool, size)
|
||||||
|
for i := range size {
|
||||||
|
palindromes[i] = make([]bool, size)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the ranges that represent a palindrome
|
||||||
|
checkPalindromes := func(i, j int) {
|
||||||
|
if i < 0 || j >= len(s) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for i >= 0 && j < len(s) && s[i] == s[j] {
|
||||||
|
palindromes[i][j+1] = true
|
||||||
|
|
||||||
|
i -= 1
|
||||||
|
j += 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for i, _ := range s {
|
||||||
|
checkPalindromes(i, i)
|
||||||
|
checkPalindromes(i, i+1)
|
||||||
|
}
|
||||||
|
|
||||||
|
return palindromes
|
||||||
|
}
|
||||||
|
|
||||||
|
func getPartitions(s string, palindromes [][]bool) [][]string {
|
||||||
|
var partitions [][]string
|
||||||
|
var currentPartition []string
|
||||||
|
|
||||||
|
var dfs func(int)
|
||||||
|
dfs = func(i int) {
|
||||||
|
if i >= len(s) && len(currentPartition) > 0 {
|
||||||
|
partitions = append(partitions, slices.Clone(currentPartition))
|
||||||
|
return
|
||||||
|
} else if i >= len(s) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for j := len(s); j > i; j-- {
|
||||||
|
if !palindromes[i][j] {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
currentPartition = append(currentPartition, s[i:j])
|
||||||
|
dfs(j)
|
||||||
|
currentPartition = currentPartition[:len(currentPartition)-1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dfs(0)
|
||||||
|
return partitions
|
||||||
|
}
|
||||||
|
|
||||||
|
func partition(s string) [][]string {
|
||||||
|
return getPartitions(s, getPalindromes(s))
|
||||||
|
}
|
Loading…
Reference in a new issue