palindrome.go
/*
Package palindrome is for finding palindromes
*/
package palindrome
import (
"sync"
)
// Single searches for the longest palindrome in the input string.
// Single thread version
func Single(str string) string {
if str == "" {
return ""
}
var longest string
for k := 1; k < len(str)/2+1; k++ {
var candidate string
for i := 1; k-i > -1 && k+i < len(str); i++ {
if str[k-i] == str[k+i] {
candidate = str[k-i : k+i+1]
} else {
break
}
}
if len(candidate) > len(longest) {
longest = candidate
}
}
return longest
}
// Concurrent returns the longest palindrome in str
// Concurrent version
func Concurrent(str string) string {
if str == "" {
return ""
}
var longest string
var wg sync.WaitGroup
results := make(chan string)
for k := 1; k < len(str)/2+1; k++ {
wg.Add(1)
go func(char string, num int) {
defer wg.Done()
results <- palWorker(char, num)
}(str, k)
}
go func() {
wg.Wait()
close(results)
}()
for candidate := range results {
if len(candidate) > len(longest) {
longest = candidate
}
}
return longest
}
func palWorker(str string, k int) string {
var longest string
for i := 1; k-i > -1 && k+i < len(str); i++ {
if str[k-i] == str[k+i] {
longest = str[k-i : k+i+1]
} else {
break
}
}
return longest
}