給定一個字符串 s,將 s 分割成一些子串,使每一個子串都是迴文串。 返回 s 全部可能的分割方案。算法
輸入: "aab"
輸出:
[
["aa","b"],
["a","a","b"]
]
複製代碼
既然是全部可能的方案,那麼回溯就應該是第一個映入腦海的可人兒了。
一言以蔽之: 咱們從字符串開頭算起,找到【最短的 || 次短的 || ... || 最長的】迴文串,切掉。餘下的字符串重複。
上碼app
func partition(s string) [][]string {
re := [][]string{}
DFS := func (string, []string) {}
DFS = func (ss string, r []string) {
if len(ss) == 0 {
//連變量名都懶得想了。。。
fff := append([]string{},r...)
re = append(re, fff)
return
}
for i:=1; i<=len(ss); i++ {
//值得一提的就是這裏,每次判斷當前的是否是迴文串,是就咔嚓了。
if isH(ss[:i]) {
DFS(ss[i:],append(r,ss[:i]))
}
}
}
DFS(s,[]string{})
return re
}
//判斷迴文串的方法,雙指針無需多言
func isH (s string) bool {
l,h := 0,len(s)-1
if l == 1 {
return true
}
for l<h {
if s[l] != s[h] {
return false
}
l++
h--
}
return true
}
複製代碼
今天咱們繼續高頻專題。咬緊牙關作給本身看就好!ui
算法夢想家,來跟我一塊兒玩算法,玩音樂,聊聊文學創做,我們一塊兒天馬行空! spa