Skip to content

Commit

Permalink
Merge pull request #831 from vaskoz/day411
Browse files Browse the repository at this point in the history
Day411
  • Loading branch information
vaskoz committed Jan 4, 2020
2 parents b3abc80 + 77f6690 commit d88f137
Show file tree
Hide file tree
Showing 3 changed files with 122 additions and 0 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -407,4 +407,5 @@ problems from
* [Day 407](https://github.com/vaskoz/dailycodingproblem-go/issues/823)
* [Day 408](https://github.com/vaskoz/dailycodingproblem-go/issues/825)
* [Day 410](https://github.com/vaskoz/dailycodingproblem-go/issues/828)
* [Day 411](https://github.com/vaskoz/dailycodingproblem-go/issues/830)

73 changes: 73 additions & 0 deletions day411/problem.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package day411

// IsKPalindromeBrute answers if the input can be made into a palindrome
// by at most k-deletions.
// Runtime is O(2^N).
func IsKPalindromeBrute(str string, k int) bool {
orig := []rune(str)
rev := make([]rune, len(orig))

for i := 0; i < len(orig); i++ {
rev[i] = orig[len(orig)-1-i]
}

return isKPalindromeBrute(orig, rev, len(orig), len(rev)) <= k*2
}

func isKPalindromeBrute(orig, rev []rune, oi, ri int) int {
switch {
case oi == 0:
return ri
case ri == 0:
return oi
case orig[oi-1] == rev[ri-1]:
return isKPalindromeBrute(orig, rev, oi-1, ri-1)
default:
return 1 +
min(isKPalindromeBrute(orig, rev, oi-1, ri),
isKPalindromeBrute(orig, rev, oi, ri-1))
}
}

// IsKPalindromeDP answers if the input can be made into a palindrome
// by at most k-deletions.
// Runtime and space are both O(N^2) where N is the length of the input.
func IsKPalindromeDP(str string, k int) bool {
orig := []rune(str)
rev := make([]rune, len(orig))

for i := 0; i < len(orig); i++ {
rev[i] = orig[len(orig)-1-i]
}

return isKPalindromeDP(orig, rev) <= k*2
}

func isKPalindromeDP(orig, rev []rune) int {
dp := make([][]int, len(orig)+1)
for i := range dp {
dp[i] = make([]int, len(orig)+1)
for j := range dp[i] {
switch {
case i == 0:
dp[i][j] = j
case j == 0:
dp[i][j] = i
case orig[i-1] == rev[j-1]:
dp[i][j] = dp[i-1][j-1]
default:
dp[i][j] = 1 + min(dp[i-1][j], dp[i][j-1])
}
}
}

return dp[len(orig)][len(rev)]
}

func min(a, b int) int {
if a < b {
return a
}

return b
}
48 changes: 48 additions & 0 deletions day411/problem_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package day411

import "testing"

// nolint
var testcases = []struct {
input string
k int
expected bool
}{
{"waterrfetawx", 2, true},
}

func TestIsKPalindromeBrute(t *testing.T) {
t.Parallel()

for _, tc := range testcases {
if result := IsKPalindromeBrute(tc.input, tc.k); result != tc.expected {
t.Errorf("Expected %v got %v", tc.expected, result)
}
}
}

func BenchmarkIsKPalindromeBrute(b *testing.B) {
for i := 0; i < b.N; i++ {
for _, tc := range testcases {
IsKPalindromeBrute(tc.input, tc.k)
}
}
}

func TestIsKPalindromeDP(t *testing.T) {
t.Parallel()

for _, tc := range testcases {
if result := IsKPalindromeDP(tc.input, tc.k); result != tc.expected {
t.Errorf("Expected %v got %v", tc.expected, result)
}
}
}

func BenchmarkIsKPalindromeDP(b *testing.B) {
for i := 0; i < b.N; i++ {
for _, tc := range testcases {
IsKPalindromeDP(tc.input, tc.k)
}
}
}

0 comments on commit d88f137

Please sign in to comment.