LeetCode 字符串的排列全排列问题(剑指offer38)

func permutation(s string) []string { //思路:使用寻找下一个增长序列(同官方解题) //步骤:1.升序排序 2.依次使用寻找下一个序列查找下一个符合条件的序列 3.返回结果 bs := []rune(s) l := len(bs) if l == 0 || l > 8 { //panic("参数长度异常") return []string{} }sort.Slice(bs, func (a, b int) bool { return bs[a] < bs[b] })list := make([]string, 0, l) for { list = append(list, string(bs)) if !nextPermutation(bs) { break } } return list }func nextPermutation(bs []rune) bool { l := len(bs) //左边起始查找位,按照之前置换原则,只有右数比左数大才能有下一个更大序列 lIdx := l - 2 for lIdx >= 0 && bs[lIdx] >= bs[lIdx+1] { lIdx-- } if (lIdx < 0) { return false } //从最右边开始找,第一个比lIdx大的数即为,最小的大值 rIdx := l - 1 for rIdx >= 0 && bs[lIdx] >= bs[rIdx] { rIdx-- } bs[lIdx], bs[rIdx] = bs[rIdx], bs[lIdx] //按照前面的置换原则,将后面的序列,反转即为新的升序[) reverse(bs[lIdx+1:]) return true }func reverse(list []rune) { for i, l := 0, len(list); i < l/2; i++ { list[i], list[l-1-i] = list[l-1-i], list[i] } }

    推荐阅读