對於這篇文章,我們將以本系列之前的 2 篇文章為基礎。
寫一個 golang 函數來找出字串中的所有回文。
我將其解釋為“從給定的字串中,找到其中所有回文字串”
在上一篇文章中,我們建立了一個函數來尋找給定字串中的所有唯一字串。
在上一篇文章中,我們建立了一個函數來檢查字串是否是回文。
結合使用這兩個,我們可以找到字串中所有可能的回文。
func FindAllPalindromes(str string) []string { allPalindromes := []string{} uniqueStrings := uniquecombos.FindUniqueCombinations(str) for _, uniqueString := range uniqueStrings { if palindromecheck.PalindromeCheck(uniqueString) { allPalindromes = append(allPalindromes, uniqueString) } } return allPalindromes }
事實證明,單元測試有一個值得注意的曲線球。
FindAllPalindromes 函數依照找到回文的順序建立結果陣列。這可能是也可能不是單元測試中「預期」結果的順序。
例如,字串「aba」有 4 個回文:「a」、「aa」、「aba」和「b」。但是,FindAllPalindromes 返回“a”、“aba”、“aa”和“b”。
我們這裡有幾個選擇:
寫一個函數來比較兩個陣列而不考慮順序,即兩個陣列具有相同的元素和長度。
將預期數組和結果數組進行排序,然後比較
為了簡單起見,我選擇了第二個選項,但以預先排序的形式建立了測試案例的預期結果,以節省測試運行的時間。
func TestFindAllPalindromes(t *testing.T) { testCases := []struct { input string expected []string }{ // note that expected arrays have been presorted for quicker test runs {"", []string{}}, {"a", []string{"a"}}, {"ab", []string{"a", "b"}}, {"aba", []string{"a", "aa", "aba", "b"}}, {"aab", []string{"a", "aa", "b"}}, {"abcba", []string{"a", "aa", "aba", "abba", "abcba", "aca", "b", "bb", "bcb", "c"}}, } for _, tc := range testCases { results := FindAllPalindromes(tc.input) // sort result to match expected order slices.Sort(results) if !reflect.DeepEqual(results, tc.expected) { t.Errorf("findUniqueCombinations(%q) = %v; expected %v", tc.input, results, tc.expected) } } }
我們怎麼做得更好?
在評論中發表你的想法。
謝謝!
這篇文章以及本系列所有文章的程式碼可以在這裡找到
以上是尋找字串中的所有回文的詳細內容。更多資訊請關注PHP中文網其他相關文章!