字符串02--字符串排列

字符串02--字符串排列-jz27

题目概述

  • 算法说明
    输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
  • 测试用例
    输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
    输入:
    “ab”
    输出:
    [“ab”,“ba”]

解析&参考答案

  • 解析
  1. 使用回溯法,回溯过程中若出现重复的则需要减枝。
  • 参考答案
vim jz27.go
package main

import (
	"fmt"
	"sort"
	"strings"
)

func Permutation(str string) []string {
	if str == "" {
		return nil
	}
	strList := make([]string, 0, len(str))
	for _, v := range []byte(str) {
		strList = append(strList, string(v))
	}
	var result []string
	sort.Strings(strList)
	dfs(strList, 0, &result)
	return result
}

func dfs(strs []string, index int, result *[]string) {
	if index == len(strs)-1 {
		newStr := strings.Join(strs, "")
		*result = append(*result, newStr)
		return
	}
	for i := index; i < len(strs); i++ {
		if i != index && strs[i] == strs[index] {
			continue
		}
		strs[i], strs[index] = strs[index], strs[i]
		dfs(strs, index+1, result)
	}
	for i := len(strs) - 1; i > index; i-- {
		strs[i], strs[index] = strs[index], strs[i]
	}
}

func main() {
	result := Permutation("abc")
	fmt.Println(result)
}

注意事项

  1. 递归法应该是最容易想到的方法,当然牛客题解中还有大佬使用字典序法、递增进位法、邻位互换法、递归回溯法、非递归回溯法等。
    有兴趣的读者可以在牛客上查阅具体实现方法: 字符串的排列

说明

  1. 当前使用 go1.15.8
  2. 参考 牛客网--剑指offer
    标题中jzn(n为具体数字)代表牛客网剑指offer系列第n号题目,例如 jz01 代表牛客网剑指offer中01号题目。

注意!!!

  • 笔者最近在学习 golang,因此趁机通过数据结构和算法来进一步熟悉下go语言
  • 当前算法主要来源于剑指 offer,后续会进一步补充 LeetCode 上重要算法,以及一些经典算法
  • 此处答案仅为参考,不一定是最优解,欢迎感兴趣的读者在评论区提供更优解
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昕光xg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值