当前位置: 首页 > news >正文

从零学算法(LCR 157)

某店铺将用于组成套餐的商品记作字符串 goods,其中 goods[i] 表示对应商品。请返回该套餐内所含商品的 全部排列方式 。
返回结果 无顺序要求,但不能含有重复的元素。
示例 1:
输入:goods = “agew”
输出:[“aegw”,“aewg”,“agew”,“agwe”,“aweg”,“awge”,“eagw”,“eawg”,“egaw”,“egwa”,“ewag”,“ewga”,“gaew”,“gawe”,“geaw”,“gewa”,“gwae”,“gwea”,“waeg”,“wage”,“weag”,“wega”,“wgae”,“wgea”]

  • 我的原始人解法,遍历+回溯,其实就相当于有几个字母就进行几重循环,用 set 记录每种结果来去重,用另一个 set 来排除已使用字母并在使用后回溯
  •   char[] data;// 结果 setSet<String> ans = new HashSet<>();// 回溯 setSet<Integer> set = new HashSet<>();public String[] goodsOrder(String goods) {data = goods.toCharArray();dfs("",0);String[] res = new String[ans.size()];res = ans.toArray(res);return res;}// cur:当前组合的字符串,从空字符串开始拼接public void dfs(String cur){// 根据字符串长度判断是否已经组成一个可能// 是就记录到结果 setif(cur.length()==data.length){ans.add(cur);return;}for(int i=0;i<data.length;i++){// 递归到下一层时依旧从 0~data.length 遍历,但是不能使用上一层已使用过的字符if(set.contains(i))continue;// 排除已使用的set.add(i);dfs(cur+data[i]);// 复原,保证每个字符都有机会成为头部字符,即无遗漏set.remove(i);}}
    
  • 他人题解:为了方案不遗漏,我们还可以通过固定第一位字符,再考虑剩下的字符的所有排列情况;再固定下一位,考虑剩下的所有情况…而所有情况的排列,我们通过原地交换字符来实现(这个算法的核心有一点,固定某位字符也可以看做交换,比如第 0 位和第 0 位交换,所以本质上我们就是通过从字符第 0 位到末尾第 n 位都尝试交换(0与0,0与1,0与2,0与3…),递归后尝试第 1 位到第 n 位的所有交换(1与1,1与2,1与3…),再递归尝试第 2 位到第 n 位交换的所有可能,以此保证每种可能性都不遗漏),例如 abc,我们先固定 a(交换 0,0),再固定 b(交换 1,1),最后剩下一位自然是直接可以返回一种结果了即 abc,回溯到 b 时,我们这次选择交换 1,2,得到 acb,再回溯到 a 时,我们上次是交换 0,0,这次我们选择交换 0,1,即交换 ab(此时为 [b,a,c]),然后第二位的 a 也是从 1,1 开始交换,再递归直接返回结果 bac,再回溯到 a,我们选择交换 1,2 了,最终得到 bca,然后又回溯到了最开始的 a,这次要选择交换 0,2 得到 [c,b,a]…,为了排除重复方案,我们在固定某个字符时,只需要保证它在某一位固定一次就够了,比如 aab,你在最外层遍历到第二个 a,其实就不需要再固定第二个 a 去递归了,因为得到的结果一定是重复的(固定 aa 其实就包含在固定 a 的结果中不是吗),因此我们同样需要一个 set 来记录,即剪枝操作,防止重复记录
  •   char[] data;List<String> res = new LinkedList<>();public String[] goodsOrder(String goods) {data = goods.toCharArray();dfs(0);return res.toArray(new String[res.size()]);}public void dfs(int x){// 只剩一个字符了还组合什么,直接返回if(x==data.length-1){res.add(String.valueOf(data));return;}Set<Character> set = new HashSet<>();for(int i=x;i<data.length;i++){if(set.contains(data[i]))continue;set.add(data[i]);// 交换,以保证每种可能性不遗漏swap(i,x);// 开启下层递归,即固定了第 0~x 位字符,要去固定第 x+1 位了dfs(x+1);// 复原交换,等别人用来进行其他的交换方式swap(i,x);}}void swap(int a, int b) {char tmp = data[a];data[a] = data[b];data[b] = tmp;}
    

相关文章:

从零学算法(LCR 157)

某店铺将用于组成套餐的商品记作字符串 goods&#xff0c;其中 goods[i] 表示对应商品。请返回该套餐内所含商品的 全部排列方式 。 返回结果 无顺序要求&#xff0c;但不能含有重复的元素。 示例 1: 输入&#xff1a;goods “agew” 输出&#xff1a;[“aegw”,“aewg”,“ag…...

mysql 优化 聚簇索引=主键索引吗

在 InnoDB 引擎中&#xff0c;每张表都会有一个特殊的索引“聚簇索引”&#xff0c;也被称之为聚集索引&#xff0c;它是用来存储行数据的。一般情况下&#xff0c;聚簇索引等同于主键索引&#xff0c;但这里有一个前提条件&#xff0c;那就是这张表需要有主键&#xff0c;只有…...

c# ManualResetEvent WaitHandle 实现同步

//本文演示了ManualResetEvent 类的非静态set()、Reset()、WaitOne()和 //WaitHandle类的静态方法WaitAllWaitAll() //它们用于线程间的同步控制。 //实现了如下功能&#xff1a;线程1&#xff08;定时控制&#xff09;通知线程2和线程3采集数据 //线程2和3数据采集完了&am…...

使用Packstack安装器安装一体化OpenStack云平台

【实训目的】 初步掌握OpenStack快捷安装的方法。掌握OpenStack图形界面的基本操作。 【实训准备】 &#xff08;1&#xff09;准备一台能够安装OpenStack的实验用计算机&#xff0c;建议使用VMware虚拟机。 &#xff08;2&#xff09;该计算机应安装CentOS 7&#xff0c;建…...

【Rust】4 一文讲解重点 pattern matching | trait | 生命周期 | 闭包 | 迭代器 | 智能指针 | 并发与并行

文章目录 一、pattern matching二、trait2.1 常见 trait2.1.1 Copy 和 Clone2.1.2 PartialEq 和 Eq2.1.3 PartialOrd 和 Ord2.1.4 Hash2.1.5 From, Into, TryFrom, TryInto 2.2 概念2.2.1 关联类型2.2.2 关联常量2.3.3 泛型关联类型2.3.3.1 示例: 用泛型关联类型, 创建集合工厂…...

idea Java代码格式化规范

文章目录 引入基础知识代码模板idea模板eclipse模板1.安装插件2.生成配置文件3.导入配置文件 附录一&#xff1a;xml配置项说明附录二&#xff1a;赠送 引入 最近在公司开发中&#xff0c;遇到了一点小问题&#xff0c;组内各同事的格式化规范不一致。一来导致代码样式并不统一…...

apple MFI工厂认证,干货,为防止MFI工作人员查看,已设置VIP阅读

一开始以为审核特别严格,准备了好久,经历过了之后会发现很简单,1个小时完成了所有审核事项。 好好招待审计员,比如能接送就接送,到点吃饭就尽量约时间吃饭后再审计,找个正式的会议室,该摆盘水果就摆上,让审计员感觉到公司是很重视这次的MFI审核,但是不能贿赂发红包那…...

软件企业知识库应用场景?如何搭建软件企业知识库?

想要减少人工干预、减少不必要的时间和人力成本、快速获取准确信息……这些应用场景对于我们企业来说是非常渴望在短期内实现的。 软件企业知识库 因为传统知识库仅仅是存储&#xff1a;知识只是“存储”&#xff0c;根本用不起来&#xff0c;缺乏有效的管理方式和储存载体&am…...

华为OD 滑动窗口最大值(100分)【java】B卷

华为OD统一考试A卷+B卷 新题库说明 你收到的链接上面会标注A卷还是B卷。目前大部分收到的都是B卷。 B卷对应20022部分考题以及新出的题目,A卷对应的是新出的题目。 我将持续更新最新题目 获取更多免费题目可前往夸克网盘下载,请点击以下链接进入: 我用夸克网盘分享了「华为O…...

软件测试 (用例篇)

前言 上一篇博客讲述的是一次基本的测试过程。 在我们开始做了一段时间基础测试&#xff0c;熟悉了业务之后&#xff0c;往往会分配来写测试用例&#xff0c;并且在日常测试中&#xff0c;有时也需要补充测试用例到现有的案例库中。 在这里我们将回答以下问题 1、测试用例的…...

5G技术的飞速发展:连接未来

随着科技的日益进步&#xff0c;5G通讯技术已经成为了全球科技领域的热门话题。5G&#xff0c;即第五代移动通信技术&#xff0c;带来的不仅仅是更快的网络速度&#xff0c;它的高带宽和低延迟特性将为未来的数字世界奠定基础。 速度与效率的飞跃: 5G技术的最大亮点是它极高的下…...

linux进程管理,一个进程的一生(喂饭级教学)

这篇文章谈谈linux中的进程管理。 一周爆肝&#xff0c;创作不易&#xff0c;望支持&#xff01; 希望对大家有所帮助&#xff01;记得收藏&#xff01; 要理解进程管理&#xff0c;重要的是周边问题&#xff0c;一定要知其然&#xff0c;知其所以然。看下方目录就知道都是干货…...

【SA8295P 源码分析 (四)】51 - QNX NFS Server + Android NFS Client 完整配置

【SA8295P 源码分析】51 - QNX NFS Server + Android NFS Client 完整配置 一、QNX 侧 NFS Server 修改:ip 为 192.168.118.21.1 配置拷贝 nfsd、rpcbind 到 /mnt 目录下1.2 配置 exports1.3 为NFS 共享目录挂载镜像1.4 修 startup.sh 开机自启动 nfsd Server1.5 关闭 QNX 防火…...

2023年10月23日--10月29日(主攻光追视频教程)

最好每周完成一样&#xff0c;将来每月完成一样&#xff0c;有成就感。也免得周末迷茫。 光锥目前还有56节&#xff0c; 周二到周五每天4小节。周六日每天20小节&#xff0c;应该可以完成。 即&#xff1a; 周二&#xff1a;9.5-9.8 周三&#xff1a;9.9-10.3 周四&#xff1a…...

【Python语言速回顾】——函数模块类与对象

目录 引入 一、函数 1、函数概述 2、参数和返回值 3、函数的调用 二、模块 1、模块概述 2、模块应用实例 三、类与对象 1、面向对象概述 2、类 3、类的特点 引入 为了使程序实现的代码更加简单。需要把程序分成越来越小的组成部分&#xff0c;3种方式——函数、对象…...

【JavaEE】Java的多线程编程基础知识 -- 多线程篇(2)

Java多线程编程基础知识 一、多线程的创建二、Thread类常用的方法和API2.1 Thread 的几个常见的属性2.2 start 启动一个线程2.3 终止一个线程2.4 等待一个线程-join()2.5 线程休眠函数 -sleep() 三、线程状态3.1 观察所有线程的状态3.2 线程状态和线程转移的意义 四、线程安全&…...

MFC Windows 程序设计[330]之表头控件例程(附源码)

MFC Windows 程序设计[330]之表头控件例程 程序之美前言主体运行效果核心代码逻辑分析结束语程序之美 前言 MFC是微软公司提供的一个类库(class libraries),以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含大量Wind…...

SettingsIntelligence

Android Settings 系列文章&#xff1a; Android Settings解析SettingsIntelligenceSettingsProvider 首语 Android Settings中搜索功能帮助我们可以快速访问设置项&#xff0c;进行自定义设置&#xff0c;以得到更佳的使用体验。Android Settings搜索的实现实际不在Setting…...

C#WPF Prism框架区域管理应用实例

本文实例演示C#WPFPrism框架区域管理应用实例 目录 一、Prism框架区域 二、不使用Prism框架的RegionManager 三、使用Prism框架的RegionManager 一、Prism框架区域...

LabVIEW基于机器视觉的钢轨表面缺陷检测系统

LabVIEW基于机器视觉的钢轨表面缺陷检测系统 机器视觉检测技术和LabVIEW软件程序&#xff0c;可以实现轨道工件的表面质量。CMOS彩色工业相机采集的图像通过图像预处理、图像阈值分割、形态分析、特征定位和图案匹配进行处理和分析。图形显示界面采用LabVIEW软件编程设计&…...

Vue3 + TypeScript 实战:从 React 视角理解类型系统的10个关键差异

一、前言 在 2026 年的软件开发中&#xff0c;Vue3 已经成为每一位工程师必须掌握的技能。无论是构建高性能后端服务、开发响应式前端界面&#xff0c;还是维护生产级服务器集群&#xff0c;这项技术都在其中扮演着关键角色。 很多开发者在入门阶段会遇到一个普遍问题&#x…...

痞子衡嵌入式:turbo-spiboot - 一种基于MCUBoot协议的二级SPI加载APP提速方案必

前面我们对 Kafka 的整体架构和一些关键的概念有了一个基本的认知&#xff0c;本文主要介绍 Kafka 的一些配置参数。掌握这些参数的作用对我们的运维和调优工作还是非常有帮助的。 写在前面 Kafka 作为一个成熟的事件流平台&#xff0c;有非常多的配置参数。详细的参数列表可以…...

PowerPaint-V1 Gradio实现.NET图像处理应用:跨平台开发实战

PowerPaint-V1 Gradio实现.NET图像处理应用&#xff1a;跨平台开发实战 如果你正在寻找一种方法&#xff0c;将前沿的AI图像修复能力集成到你自己的.NET应用中&#xff0c;那么你来对地方了。想象一下&#xff0c;你的电商应用能一键移除商品图片中的瑕疵水印&#xff0c;或者…...

Flash浏览器终极指南:一键解决Flash内容播放难题,免费重温经典游戏

Flash浏览器终极指南&#xff1a;一键解决Flash内容播放难题&#xff0c;免费重温经典游戏 【免费下载链接】CefFlashBrowser Flash浏览器 / Flash Browser 项目地址: https://gitcode.com/gh_mirrors/ce/CefFlashBrowser 还在为无法播放网页Flash内容而烦恼吗&#xff…...

FireRed-OCR Studio保姆级教程:@st.cache_resource缓存机制深度解析

FireRed-OCR Studio保姆级教程&#xff1a;st.cache_resource缓存机制深度解析 1. 为什么需要缓存机制 在开发FireRed-OCR Studio这样的工业级文档解析工具时&#xff0c;我们面临一个关键挑战&#xff1a;模型加载和初始化过程非常耗时。Qwen3-VL这样的多模态大模型通常需要…...

Llama-3.2-3B多语言能力实测:西班牙语/法语/日语问答效果展示

Llama-3.2-3B多语言能力实测&#xff1a;西班牙语/法语/日语问答效果展示 最近&#xff0c;Meta开源了Llama 3.2系列模型&#xff0c;其中包含1B和3B两个尺寸。作为Llama 3.1的升级版&#xff0c;3.2版本特别强调了多语言能力。官方宣称它在多语言对话、检索和摘要任务上表现优…...

【R 4.5时空数据实战白皮书】:从GPS轨迹聚类到疫情传播模拟,8个生产级案例代码全开源(含GitHub Actions自动化验证脚本)

第一章&#xff1a;R 4.5时空数据可视化工具概览与生态演进R 4.5&#xff08;发布于2023年4月&#xff09;标志着时空数据分析生态的重要转折点&#xff1a;核心图形引擎全面支持高精度地理坐标系投影缓存&#xff0c;sf、stars 和 spacetime 等关键包完成与 R 4.5 的 ABI 兼容…...

大模型幻觉与知识瓶颈?收藏这份RAG架构指南,小白也能轻松入门并提升模型能力!

本文深入剖析了大语言模型&#xff08;LLM&#xff09;的“能力边界”——幻觉与知识瓶颈的根源&#xff0c;详细解读了RAG&#xff08;检索增强生成&#xff09;架构如何通过引入外部知识检索系统与生成模型推理引擎的解耦与重构&#xff0c;实现“实时检索、动态补全、基于事…...

2-4有关项目‘基于音乐喜好的智能选型平台’中间层建立

建立中间层代码&#xff1a;select * from music_top250;CREATE TABLE yinyvepaihang.yinyve_info_mid (-> id INT PRIMARY KEY,-> yinyve_name VARCHAR(500) NOT NULL,-> yinyve_info TEXT NOT NULL,-> author VARCHAR(255),-> publisher …...

YOLOv8 智能交通违章检测 - 车牌识别与黑名单比对详解

YOLOv8 智能交通违章检测 - 车牌识别与黑名单比对详解 在交通违章检测系统中,车牌识别 (License Plate Recognition, LPR) 是锁定违法主体的关键,而黑名单比对则是实现自动预警和布控的核心业务逻辑。 本方案采用 YOLOv8 (车牌检测) + CRNN/LPRNet (字符识别) + 内存/Redis…...