【动态规划、递归回溯】字符串的排列

2023-05-16

题目描述

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
示例
输入
“ab”
返回值
[“ab”,“ba”]


动态规划

动态规划的思想是将问题分解成子问题,从最小的子问题开始解,不断扩大子问题,并利用子问题的解来求解大问题,直到解出原问题。

对于字符串排列,最小的子问题是单个字符,它的排列就是它本身,然后不断在尾部增加字符,增加字符时利用上一个子问题的排列结果,例如假设当前问题是abc,它的子问题是ab的排列,假设我们已经知道ab的解是{ab, ba},则在这个解的基础上插入新字符c,例如在解ab的基础上可以得到{cab, acb, abc},同理在ba的基础上可以得到{cba, bca, cab},最终得到问题abc的解为{cab, acb, abc, cba, bca, cab},思路十分直观。

在实现的过程中,为了避免重复解的存在,使用一个HashMap来存储结果,自动去重,最后进行排序即可

public ArrayList<String> Permutation(String str) {
   HashMap<String, Integer> hashMap = new HashMap<>();
    int len = str.length(); // 获取字符串长度
    hashMap.put(str.substring(0, 1), 1);
    for (int i = 1; i < len; i++) {
        HashMap<String, Integer> tmp = new HashMap<>();
        String insert = str.substring(i, i + 1);
        for (String s : hashMap.keySet()) {
            // 在每个字符串中从前到尾插入当前字符
            for (int j = 0; j < s.length() - 1; j++) {
                String front = s.substring(0, j + 1), behind = s.substring(j + 1);
                tmp.put(front + insert + behind, 1);
            }
            // 头和尾
            tmp.put(insert + s, 1);
            tmp.put(s + insert, 1);
        }
        hashMap = tmp;
    }
    ArrayList<String> res = new ArrayList<>();
    for (String s : hashMap.keySet())
        res.add(s);
    // 排序
    Collections.sort(res);
    return res;
}

递归回溯

递归法的思想如下图(图片参考),将第一个字符与后面的字符交换,可以得到每个字符都在开头的所有情况,然后固定第一个字符,递归地去搜索
它的子字符串的解,子字符串同样是固定前面部分,此时则是交换第二个字符和后面的所有字符,并固定前两个字符,搜索它的子字符串的解;…

递归出口是当字符串只有一个字符时,此时就可以保存排列好的结果

在这里插入图片描述

在是实现时,由于需要频繁交换字符串中两个位置的值,因此先将String转换为char数组,在交换时更加高效,

public ArrayList<String> Permutation(String str) {
	ArrayList<String> res = new ArrayList<>();
	PermutationHelper(str.toCharArray(), 0, res);
	// 排序
	Collections.sort(res);
	for (String s : res)
		System.out.print(s + " ");
	return res;
}

public static void PermutationHelper(char[] str, int index, ArrayList<String> res) {
	if (index == str.length - 1) {
		// 若不重复则添加到结果中
		if (!res.contains(String.valueOf(str))) res.add(String.valueOf(str)); 
		return;
	}
	for (int i = index; i < str.length; i++) {
		// swap index and i
		swap(str, index, i);
		PermutationHelper(str, index + 1, res);
		swap(str, i, index); // 需要交换回来,不改变str的值
	}
}

public static void swap(char[] str, int i, int j) {
	char temp = str[i];
	str[i] = str[j];
	str[j] = temp;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【动态规划、递归回溯】字符串的排列 的相关文章

  • 【python】不同目录下导入py文件

    https zhuanlan zhihu com p 64893308
  • 【python】使用cupy加速

    cupy和numpy使用类似 xff0c 不同的是cupy在计算数组和矩阵时直接调用GPU来加速 xff0c 而numpy是调用cpu计算 在使用cupy时需要注意 xff0c cupy适合高维大尺寸的向量计算 xff0c 因为初始化GPU
  • 【点云可视化】自制ply文件并使用open3d可视化点云

    使用open3d可视化点云 xff0c 需要将点云制作为ply文件传入函数中 安装open3d 直接使用pip安装 pip span class token function install span open3d ply文件 ply文件的
  • 【python】返回列表排序索引

    arr span class token operator 61 span span class token punctuation span span class token number 1 span span class token
  • 【win10】安装pytorch1.6.0+cuda10.1 + torch-geometric

    conda下新建一个环境 xff0c 使用python3 6 conda create name torch ge span class token assign left variable python span span class t
  • 【python】制作GIF

    导入库 span class token keyword import span matplotlib span class token punctuation span pyplot span class token keyword as
  • 【3D体素可视化】

    可视化3D体素 xff0c voxel被表示为一个3维的数组 xff0c 每个位置为0或1 span class token keyword from span mpl toolkits span class token punctuati
  • OVS 使用总结

    1 简介 Open vSwitch 是一个用C语言开发的多层虚拟交换机 1 1 工作原理 内核模块实现了多个 数据路径 xff08 类似网桥 xff09 每个都可以有多个 vports xff08 类似网桥的端口 xff09 每个数据路径也
  • MySQL常用函数学习

    前言 MySQL函数是MySQL数据库提供的内置函数 xff0c 这些内置函数可以更方便处理表中的数据 下面简单介绍一下MySQL中包含的几类常用函数 聚合函数 聚合函数可实现根据一组数据求出一个值 xff0c 聚合函数的结果值只根据选定数
  • 【双指针(快慢指针)】链表中倒数第k个结点

    题目 输入一个链表 xff0c 输出该链表中倒数第k个结点 暴力解法 很多种 xff0c 先遍历一遍 xff0c 统计链表的长度 xff0c 让后找正数的第n k 1个节点 快慢指针 使用两个指针 xff0c fast和slow xff0c
  • 【反转链表】

    题目 输入一个链表 xff0c 反转链表后 xff0c 输出新链表的表头 题解 遍历一遍链表 xff0c 在遍历的过程中不断将指向关系反转 xff0c 可以想到需要两个指针fast和slow xff0c fast在前 xff0c slow在
  • 【python】argparse转换为字典

    在使用argparse定义程序参数时 xff0c 常规用法如下 xff1a span class token keyword import span argparse parser span class token operator 61
  • 【pytorch】多GPU训练

    使用多GPU训练pytorch模型只需要加一句DataParallel即可 xff0c 如下 span class token keyword from span torch span class token punctuation spa
  • pytorch列表添加模块

    在使用pytorch将多个模块添加到列表时不能使用简单的list xff0c 需要使用torch nn ModuleList xff0c 否则框架无法跟踪到模块且不能使用model cuda 将模型转移到GPU上 xff0c 会产生以下错误
  • 【python】将列表划分为多个子列表

    参考 将列表划分为包含3个元素的子列表 a span class token operator 61 span span class token punctuation span span class token number 1 span
  • 【pytorch】点乘、矩阵乘法

    点乘即两个相同大小的矩阵对应位置相乘 xff0c 使用torch mul a b xff0c a和b的大小需要相等 矩阵乘法需要满足矩阵乘法的原则 xff0c 使用torch matmul a b xff0c a和b需要满足矩阵乘法的规则
  • 【pytorch】1x1卷积

    对image进行1x1卷积 xff0c 输入为 b a t c h
  • VS code远程链接linux服务器开发

    https blog csdn net weixin 42864357 article details 105658765
  • 解决ValueError: Expected more than 1 value per channel when training

    出现这个问题是因为网络中存在BatchNormalization模块 xff0c 它需要多于1个数据来计算平均值 xff0c 当batch只有一个数据时会报错 如果使用pytorch xff0c 可以在获取数据集时 xff0c 将DataL
  • Etcd 入门简介

    1 简介 Etcd 是 CoreOS 基于 Raft 开发的分布式 key value 存储 xff0c 可用于服务发现 共享配置以及一致性保障 xff08 如数据库选主 分布式锁等 xff09 1 1 特性 Go 语言实现的高可靠 KV

随机推荐

  • 【torch.index_select】利用下标提取tensor中的值

    torch index select self Tensor dim Union str None index Tensor xff1a 第一个Tensor是被操作的tensor xff0c dim表示要操作的维度 xff0c index是
  • 【pytorch select】索引函数

    select dim index xff1a 第一个参数为索引的维度 xff0c 第二个参数为索引的维度的序列号 span class token keyword import span torch a span class token o
  • 【双y轴图】python制作双y轴图

    span class token keyword import span matplotlib span class token punctuation span pyplot span class token keyword as spa
  • Linux上安装open3d

    pip install span class token operator span span class token operator span user open3d span class token operator span pyt
  • Linux下搜索软件的安装路径

    Linux下搜索软件的安装路径 xff0c 例如 xff0c hbase span class token function whereis span hbase
  • win10+VS2017安装PCL库

    参考博客 https www jianshu com p 463f54c91ab7 https blog csdn net weixin 41991128 article details 83864713 可能出现的问题 xff1a 使用V
  • 【python】使用open3d进行mesh sampling

    span class token keyword import span open3d span class token keyword as span o3d mesh path span class token operator 61
  • 【链表】两个链表的第一个公共结点

    题目描述 输入两个链表 xff0c 找出它们的第一个公共结点 xff08 注意因为传入数据是链表 xff0c 所以错误测试数据的提示是用其他方式显示的 xff0c 保证传入数据是正确的 xff09 解法 这题首先需要理解两个链表的公共节点的
  • 【链表】链表中环的入口结点

    题目描述 给一个链表 xff0c 若其中包含环 xff0c 请找出该链表的环的入口结点 xff0c 否则 xff0c 输出null 快慢指针法 求解链表中关于环的问题最常见的是使用快慢指针 xff0c fast指针和slow指针均从链表的头
  • 【链表】删除链表中的重复节点

    题目描述 在一个排序的链表中 xff0c 存在重复的结点 xff0c 请删除该链表中重复的结点 xff0c 重复的结点不保留 xff0c 返回链表头指针 例如 xff0c 链表1 gt 2 gt 3 gt 3 gt 4 gt 4 gt 5
  • Etcd 使用总结

    1 简介 Etcd API 特性 xff1a 原子性 xff1a 一个操作要么全部执行 xff0c 要么全部不执行一致性 xff1a 不论客户端请求的是哪个etcd服务器 xff0c 它都能读取到相同的事件 xff0c 而且这些事件的顺序也
  • 【torch.nn.AdaptiveMaxPool】

    Pytorch提供了自适应池化层torch nn AdaptiveMaxPool xff0c 这种层和一般的池化层一样 xff0c 都没有参数 xff0c 都是对特征进行降采样 xff0c 自适应的意思是在使用池化层时不需要指定核的大小步长
  • 【链表】复杂链表的复制

    题目描述 输入一个复杂链表 xff08 每个节点中有节点值 xff0c 以及两个指针 xff0c 一个指向下一个节点 xff0c 另一个特殊指针random指向一个随机节点 xff09 xff0c 请对此链表进行深拷贝 xff0c 并返回拷
  • 【数组】顺时针打印矩阵

    题目 输入一个矩阵 xff0c 按照从外向里以顺时针的顺序依次打印出每一个数字 xff0c 例如 xff0c 如果输入如下4 X 4矩阵 xff1a 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出
  • 【数组】数组中出现次数超过一半的数字

    题目描述 数组中有一个数字出现的次数超过数组长度的一半 xff0c 请找出这个数字 例如输入一个长度为9的数组 1 2 3 2 2 2 5 4 2 由于数字2在数组中出现了5次 xff0c 超过数组长度的一半 xff0c 因此输出2 如果不
  • java for循环的几种写法

    参考 xff1a https blog csdn net qq 36804363 article details 87539927 span class token keyword int span span class token pun
  • 【双指针】和为S的两个数字

    题目描述 输入一个递增排序的数组和一个数字S xff0c 在数组中查找两个数 xff0c 使得他们的和正好是S xff0c 如果有多对数字的和等于S xff0c 输出两个数的乘积最小的 输入 1 2 4 7 11 15 15 返回值 4 1
  • 【动态规划】连续子数组的最大和

    题目描述 输入一个整型数组 xff0c 数组里有正数也有负数 数组中的一个或连续多个整数组成一个子数组 求所有子数组的和的最大值 要求时间复杂度为 O n 输入 xff1a 1 2 3 10 4 7 2 5 返回值 xff1a 18 说明
  • Java交换字符串中两个位置的值

    需求 xff1a 对一字符串abcd xff0c 要求交换位置0和位置2的两个字符 xff0c 交换结果为cbad java高效实现方案 xff0c 先将String转换为char数组 xff0c 数组可以修改任意位置的值 xff0c 进行
  • 【动态规划、递归回溯】字符串的排列

    题目描述 输入一个字符串 按字典序打印出该字符串中字符的所有排列 例如输入字符串abc 则按字典序打印出由字符a b c所能排列出来的所有字符串abc acb bac bca cab和cba 输入一个字符串 长度不超过9 可能有字符重复 字