/* 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 }