1 回答

TA貢獻1784條經驗 獲得超8個贊
您走在正確的軌道上,整體形式看起來不錯,但細節仍然模糊。
首先,
newS?:=?s[:idx] suffix?:=?s[idx?:?idx+1] newS?+=?suffix
相當于
newS?:=?s[:idx+1]
這里并沒有發生真正的排列;這是砍掉字符串的后面并i
完全忽略循環變量。嘗試為每個遞歸調用交換字符串中的兩個字符,并使用兩者i
來idx
執行此操作;可以將其視為與每個調用框架idx
交換每個元素的固定樞軸i...len(s)
。不過,確保您不會重新分配給當前作用域中的字符串,這很好,因為這會擾亂循環后續迭代的狀態。
第二個建議:為了建立基本情況,遞歸地向上計數len(s)
而不是向下計數到零。您幾乎可以假裝數組的整個第一個塊不存在??梢詫⑵湟暈槌R幣帕兴惴?,只不過您跳過了第一個idx
索引。
另外,這更多的是一個設計點,而不是一個算法問題,但我會將參數公開idx
給調用者,而不是將其隱藏在包裝器后面。permute
這使得該函數可重用,并且其作用更加明顯 - 作為庫的用戶,如果名為的函數拒絕排列前 2 個字符,我會感到困惑。
返回結果比產生打印等副作用更好,但出于教學目的,我將把它放在一邊。
這是一種解決方案(劇透警告?。?/p>
package main
?
import "fmt"
?
func permute(s string, idx int) {
? ? if idx == len(s) {
? ? ? ? fmt.Println(s)
? ? }
?
? ? for i := idx; i < len(s); i++ {
? ? ? ? a := []rune(s)
? ? ? ? a[i], a[idx] = a[idx], a[i]
? ? ? ? permute(string(a), idx + 1)
? ? }
}
?
func main() {
? ? permute("abcde", 2)
}
permute("abcde", 2)
產生
abcde abced abdce abdec abedc abecd
- 1 回答
- 0 關注
- 163 瀏覽
添加回答
舉報