可视化图解算法57:字符串的排列

牛客网 面试笔试 TOP101 | LeetCode 3437. 全排列III

1. 题目

描述

输入一个长度为 n 字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组。

例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。

数据范围:n < 10 要求:空间复杂度 O(n!),时间复杂度 O(n!)

输入描述:

输入一个字符串,长度不超过10,字符只包括大小写字母。

示例1

输入:

"ab"

返回值:

"ab","ba"

说明:

返回["ba","ab"]也是正确的

示例2

输入:

"aab"

返回值:

"aab","aba","baa"

示例3

输入:

"abc"

返回值:

"abc","acb","bac","bca","cab","cba"

示例4

输入:

" "

返回值:

2. 解题思路

字符串的排列可以使用回溯算法,要注意字符串中有可能包含相同的字符。具体思路如下:

遍历每一个元素,以该元素作为开头的数字数列。首先选取该数字,并标记该数字已经使用过;再递归选择其他数字;撤销该数字,让其他数字作为开头。缩小数字区间:该元素已经使用过;当前元素与前一个元素一样,且前一个已经使用过。

如果文字描述的不太清楚,你可以参考视频的详细讲解。

3. 编码实现

核心代码如下:

Go 复制代码
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param str string字符串
 * @return string字符串一维数组
 */
func Permutation(str string) []string {
	// write code here
	result = make([]string, 0)
	path = make([]string, 0)
	//字符串为数组
	arr := strings.Split(str, "")
	sort.Strings(arr)
	mark = make([]bool, len(arr))
	//回溯获取结果
	backtracking(arr)
	return result
}

var (
	result []string //结果集
	path   []string //路径
	mark   []bool
)

func backtracking(arr []string) {
	// 2. 递归终止条件:路径数组满了(找到一种路径),加入到输出列表
	if len(path) == len(arr) {
		//2.1 存放结果
		tmp := strings.Join(path, "") //切片转string
		result = append(result, tmp)
		//2.2 返回
		return
	}

	//1.选择:在本层集合中遍历元素
	for i := 0; i < len(arr); i++ {
		//1.4剪枝:
		// 1.4.1 元素已经使用过则不需要再加入了
		if mark[i] {
			continue
		}
		// 1.4.2 当前的元素charStr[i]与同一层的前一个元素charStr[i-1]相同且charStr[i-1]已经用过了
		if (i >= 1) && (arr[i] == arr[i-1] && mark[i-1]) {
			continue
		}

		//1.1 处理节点 (选取字符)
		path = append(path, arr[i]) //加入路径数组
		mark[i] = true              //标记为使用过
		// 1.2 递归(选择其他字符)
		backtracking(arr)
		//1.3 回溯,撤销选择
		path = path[:len(path)-1]
		mark[i] = false

	}
}

具体完整代码你可以参考下面视频的详细讲解。

4.小结

字符串的排列可以使用回溯算法,要注意字符串中有可能包含相同的字符。遍历每一个元素,以该元素作为开头的数字数列。首先选取该数字,并标记该数字已经使用过;再递归选择其他数字;撤销该数字,让其他数字作为开头。

《数据结构与算法》深度精讲课程正式上线啦!7 大核心算法模块全解析:

✅ 链表

✅ 二叉树

✅ 二分查找、排序

✅ 堆、栈、队列

✅ 回溯算法

✅ 哈希算法

✅ 动态规划

无论你是备战笔试面试 、提升代码效率 ,还是突破技术瓶颈,这套课程都将为你构建扎实的算法思维底座。🔥立即加入学习打卡,与千名开发者共同进阶!

对于数据结构与算法,我们总结了一套【可视化+图解】方法,依据此方法来解决相关问题,算法变得易于理解,写出来的代码可读性高也不容易出错。具体也可以参考视频详细讲解。

今日佳句:黄沙百战穿金甲,不破楼兰终不还。

相关推荐
hnjzsyjyj16 小时前
东方博宜OJ 2190:树的重心 ← 邻接表 or 链式前向星
数据结构·链式前向星·树的重心
yaoh.wang18 小时前
力扣(LeetCode) 13: 罗马数字转整数 - 解法思路
python·程序人生·算法·leetcode·面试·职场和发展·跳槽
ChoSeitaku18 小时前
NO15数据结构选择题考点|线性表|栈和队列|串
数据结构
T1ssy18 小时前
布隆过滤器:用概率换空间的奇妙数据结构
算法·哈希算法
hetao173383719 小时前
2025-12-12~14 hetao1733837的刷题笔记
数据结构·c++·笔记·算法
一直都在57219 小时前
数据结构入门:时间复杂度与排序和查找
数据结构
鲨莎分不晴20 小时前
强化学习第五课 —— A2C & A3C:并行化是如何杀死经验回放
网络·算法·机器学习
搞科研的小刘选手20 小时前
【ISSN/ISBN双刊号】第三届电力电子与人工智能国际学术会议(PEAI 2026)
图像处理·人工智能·算法·电力电子·学术会议
拉姆哥的小屋20 小时前
从混沌到秩序:条件扩散模型在图像转换中的哲学与技术革命
人工智能·算法·机器学习
Sammyyyyy21 小时前
DeepSeek v3.2 正式发布,对标 GPT-5
开发语言·人工智能·gpt·算法·servbay