【算法】字典序超详细解析(让你有一种相见恨晚的感觉!)

目录

一、前言

二、什么是字典序 ?

✨字典序概念

✨深度理解字典序

✨字典序排序的重要性和应用场景

 三、常考面试题

 ✨ 下一个排列

 ✨ 字典数排序

 ✨ 字典序最小回文串

 四、共勉


一、前言

    经常刷算法题的朋友,肯定会经常看到题目中提到 字典序 这样的字眼,或者需要我们通过字典序来解题,由于之前对字典序了解的不太清楚,导致做题的时候总会卡住,所以收集了一些资料来详解字典序。

二、什么是字典序 ?

 ✨字典序概念

    字典序(dictionary order),又称 字母序(alphabetical order),含义是表示英文单词在字典中的先后顺序,在计算机领域中扩展成两个任意字符串的大小关系。 

 举例:
       在字典中,单词是按照首字母在字母表中的顺序进行排列的,比如 alphabeta 之前。而第一个字母相同时,会去比较两个单词的第二个字母在字母表中的顺序,比如 accountadvanced 之前,以此类推。下列单词就是按照字典序进行排列的:

asasterastrolabeastronomyastrophysicsatatamanattackbaa

✨深度理解字典序

  • 在学习 字符串string 的时候,我们肯定接触过两个字符串之间的比较,比如”abc“ < “acb” < “acbd”, 其规则是先比较第一个字母,如果不相等,就直接得到结果,如果相等,就比较下一个字母。
  • 如果两个字符串的长度不相等,但是长的那个字符串包含了短的那个,那长的那个字符串更大(比如"acb" < “acbd”)
  • 在我们进行比较之前,有一个默认的排序规则,就是‘a' < 'b' < 'c' < ... < 'z'

举例:

对数字 【1,2,3,4,5,6,7,8,9,10,11,12,13】 按照字典序排列:
结果为 :【1,10,11,12,13,2,3,4,5,6,7,8,9】 

总结: 
      对于两个不同的字符串,从左到右逐个比较它们的字符,

  1. 如果在某个位置上它们的字符不同,则将它们按照该位置上的字符的字母顺序进行排序,即较小的字符排在前面,较大的字符排在后面。
  2. 如果一直比较到其中一个字符串结束,则较短的字符串排在前面;
  3. 如果两个字符串完全相同,则它们的字典序相同。可以将它们看作是按照字母表的顺序进行排列的。

 ✨字典序排序的重要性和应用场景

  1. 数据库索引:在数据库中,使用字典序排序可以加快查询速度。例如,对存储了字符串数据的列进行字典序排序,可以使得数据库在执行字符串比较操作时更高效。
  2. 字符串比较:在字符串比较场景中,字典序排序能够方便地判断两个字符串的大小关系。例如,在编程中,可以使用字典序排序来实现字符串的字母顺序排序、查找最大/最小字符串等操作。
  3. 文件系统排序:文件系统通常使用字典序排序来显示文件和目录的顺序。这样可以使得用户在文件浏览器中更容易找到特定的文件或目录。

 三、常考面试题

      通过上面的讲解,相信大家应该对 字典序 有了一个基础的了解,想要深刻的理解它,还是需要通过题目来理解。

 ✨ 下一个排列

链接:31. 下一个排列 - 力扣(LeetCode) 

 题目分析:

  • 说实话刚看题目我看了半天不知道在说什么,看到评论里面提到字典序算法才知道题意。我们拿题目中的例子1,2,3 ------> 1,3,2来说明:
  1. 首先本题讨论的范围是数字,数字中有一个规则,就是’0‘ < '1' < '2' < ... < '9',这与上面的a~z是一样的
  2. 然后就是1,2,3这三个数字,我们能够形成6种不同的组合,即123 < 132 < 213 < 231 < 312 < 321。
  3. OK,如果你看懂前面两点,本题已经完成了。我们要做的就是找到当前数 123 在第二点的六种排列中间的下一个位置是什么,即 132,那么 132 就是答案
  4. 如果要找的数字位于排列组合的最后一个一位,即 321,那么按照题目的第二行,我们就返回最小值 123.

上面从直觉上理解了什么是字典序算法,下面说下怎么转化成程序算法。

何时无解 

首先考虑无解情况,即上面所说的321,这种情况带入字典序算法是无解的,而321这种情况,如果我们单独拆分成3,2,1三个数字,其实是一个降序的过程: 

  • 因此如果当前排列是降序的,则字典序算法无解
  • 换而言之,如果不存在后一个数比前一个数大(2<3,1<2),字典序算法无解
  • 比如下图中的54321抽象出来的五个点,不存在后一个点大于前一个点,因此无解。

 有解的情况

 下面我们拿51432这个例子,来一步步说明如何通过字典序算法得到 52134 这个答案的

 1. 从右往左找,找到第一个右边比左边大的数

  • 首先我们从最右边的2开始,因为2 < 3,因此跳过。然后3 < 4,再跳过。然后发现4 > 1,OK,第一步完成。
  • 然后我们在上图中用黄色点标记这两个数,即1 和 4

2. 找到断点右边所有数中最小的一个 (包括断点)

  • 如果我们直接交换两个黄点,得到 54132,虽然也比 51432 大,但是它不符合字典序算法中的规则,因为这两个数中间还夹杂着别的数 51432 < 52134 < 52143 < 52314 < ...... < 54132,字典序算法中必须满足两个数之间不能夹杂其他数才行。
  • 而根据上面列举的,我们知道 52134 才是我i们想要的答案,它的特点就是我们需要把 1 换成2,而不是 4。
  • 而 2 实际上就是4,3,2中间的最小值,因此这一步我们要做的就是找到左边黄点(1)右边的所有数(4,3,2)中间最小的一个数(2),然后我们用 红点标记下来。
  • 之所以要交换1和2,而不是1和3或者1和4,是因为我们现在是要把千位的1换成一个更大中的最小的情况,因此要选2.

3.交换左边的黄点和红点 

  •  上面我们找到了红点(2),因此这一步我们需要讲红点跟左边的黄点(2)进行交换,得到52431

4. 对红点右边的数进行升序排序 

  • 此时,我们交换了千位的1和个位2,变成了52431.但是距离我们的最终答案52134还差了一步,52134 < 52143 < 52314 < 52341 < 52413 < 52431,👈由这个规则可以看到我们的千位和万位已经相同了,但是个十百位还未相同了,而因为我们要找的答案要尽可能小,因此需要进行升序排序,得到52134,大功告成!

 代码:

class Solution {
public:void nextPermutation(vector<int>& nums) {// 用于判断是否无解  -- 开始默认无解bool flag = 0;for(int i = nums.size()-1;i>0;i--){if(nums[i]>nums[i-1]){// 有解flag = 1;// 初始化最小值 为右边断点 int min = nums[i],idx = i;// 向后找最小值for(int j = i+1;j<nums.size();j++){if(nums[j]<min && nums[j] > nums[i-1]){// 更新最小值min = nums[j];// 存储小标,便于后续交换idx = j;}}// 将右边最小值 和 左边最小值交换  (左右区分,以断点为界线)nums[i - 1]^= nums[idx];nums[idx]^= nums[i - 1];      // 小技巧  位运算  不用第三个参数来交换两个数nums[i - 1]^= nums[idx];// 将左边的数据 包括断点进行升序排序sort(nums.begin()+i,nums.end());break;}}// 确定误解  将动态数组全部进行 升序排序if(flag == 0){sort(nums.begin(),nums.end());}}
};

 ✨ 字典数排序

 链接:386. 字典序排数 - 力扣(LeetCode)

class Solution {
public:static bool cmp(int a,int b){string s1 = to_string(a);string s2 = to_string(b);// 字典升序return s1<s2;}vector<int> lexicalOrder(int n) {vector<int> res;while(n!=0){res.push_back(n);n--;}sort(res.begin(),res.end(),cmp);return res;}
};

 ✨ 字典序最小回文串

 链接:2697. 字典序最小回文串 - 力扣(LeetCode)

 题目分析:

     对于两个中心对称的字母 x = s[i] 和 y = s[ n - 1 - i ] , 如果 x != y ,那么只需要修改一次,就可以让这两个字母相同:把 x 改成 y 或者 把 y 改成 x。

  • 如果 x > y , 那么把 x 修改成 y 更好 , 这样字典序更小
  • 如果 x < y , 那么把 y 修改成 x 更好 , 这样字典序更小

 代码:

class Solution {
public:string makeSmallestPalindrome(string s) {// 双指针 分别指向 头部和尾部int begin = 0,end = s.size()-1;while(begin<end){if(s[begin]!=s[end]){s[begin] = s[end] = min(s[begin],s[end]);}begin++;end--;}return s;}
};

 四、共勉

  以下就是我对 字典序 的理解,如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对 C++ 的更新,请持续关注我哦!!! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/789781.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6.java openCV4.x 入门-Mat之局部区域读写及Range和Rect介绍

专栏简介 &#x1f492;个人主页 &#x1f4f0;专栏目录 点击上方查看更多内容 &#x1f4d6;心灵鸡汤&#x1f4d6;我们唯一拥有的就是今天&#xff0c;唯一能把握的也是今天建议把本文当作笔记来看&#xff0c;据说专栏目录里面有相应视频&#x1f92b; &#x1f9ed;文…

小白水平理解面试经典题目1431. Kids With the Greatest Number of Candies【Array类】

1431. 拥有最多糖果的孩子 小白渣翻译 一群孩子手里拿 着不同数目的糖果。你打算额外给每个孩子一些糖果&#xff0c;然后再确定哪些孩子拥有最多的糖果。 给你一个数组 candies &#xff0c;其中 candies[i] 代表第 i 个孩子拥有的糖果数目。另给你一个整数 extraCandies &…

vue源码解析——vue如何将template转换为render函数

Vue 将模板&#xff08;template&#xff09;转换为渲染函数&#xff08;render function&#xff09;是 Vue 编译器的核心功能&#xff0c;它是 Vue 实现响应式和虚拟 DOM 的关键步骤。在 Vue 中&#xff0c;模板&#xff08;template&#xff09;是开发者编写的类似 HTML 的代…

HackTheBox-Machines--Wifinetic

文章目录 1 端口扫描2 测试思路3 21端口测试&权限获取4 权限提升方法一方法二&#xff1a; Wifinetic 测试过程 1 端口扫描 nmap -sC -sV 10.129.229.902 测试思路 目标开启了21、22、53端口&#xff0c;并且21端口FTP服务允许匿名登录&#xff0c;所以从21端口开始进行测试…

OpenCV与AI深度学习 | OpenCV中八种不同的目标追踪算法

本文来源公众号“OpenCV与AI深度学习”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;OpenCV中八种不同的目标追踪算法 目标跟踪作为机器学习的一个重要分支&#xff0c;加之其在日常生活、军事行动中的广泛应用&#xff0c;受到…

STM32F4系列单片机的定时器讲解和计数器,PWM信号输出,PWM信号捕获的实现对电机进行控制和监测功能

1.定时器功能介绍&#xff1a; 在控制领域里面&#xff0c;我们可以用信号输出定时器&#xff0c;进行PWM的控制&#xff0c;从而达到控制电机的目的&#xff0c;通过输入捕获功能可以用来接收外部的数字信号&#xff0c;用于测量脉冲宽度、频率或周期等。在这里给大家介绍下&…

缺省参数

缺省参数 缺省参数概念 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时&#xff0c;如果没有指定实 参则采用该形参的缺省值&#xff0c;否则使用指定的实参。 void Func(int a 0) {cout<<a<<endl; } int main() {Func(); // 没有传…

Rust所有权和Move关键字使用和含义讲解,以及Arc和Mutex使用

Rust 所有权规则 一个值只能被一个变量所拥有&#xff0c;这个变量被称为所有者。 一个值同一时刻只能有一个所有者&#xff0c;也就是说不能有两个变量拥有相同的值。所以对应变量赋值、参数传递、函数返回等行为&#xff0c;旧的所有者会把值的所有权转移给新的所有者&#…

共襄盛举!400+组织携手发布「2024集成光子学路线图」

3月25日&#xff0c;麻省理工学院微光子中心与PhotonDelta基金会联合领导&#xff0c;携手全球400余家科技、学术及工业界组织&#xff0c;共同发布了2024年版集成光子学路线图。 该路线图被称为IPSR-I&#xff08;Integrated Photonics System Roadmap – International&#…

某眼实时票房接口获取

某眼实时票房接口获取 前言解决方案1.找到veri.js2.找到signKey所在位置3.分析它所处的这个函数的内容4.index参数的获取5.signKey参数的获取运行结果关键代码另一种思路票房接口:https://piaofang.maoyan.com/dashboard-ajax https://piaofang.maoyan.com/dashboard 实时票房…

Docker实例

华子目录 docker实例1.为Ubuntu镜像添加ssh服务2.Docker安装mysql docker实例 1.为Ubuntu镜像添加ssh服务 (1)访问https://hub.docker.com&#xff0c;寻找合适的Ubuntu镜像 (2)拉取Ubuntu镜像 [rootserver ~]# docker pull ubuntu:latest latest: Pulling from library/ub…

课程设计项目1.3:双音多频(DTMF)通信设计仿真

01.课程设计内容 02.代码效果图 %参考程序&#xff1a;DTMF信号的产生 kcsj131s.m 差分方程法产生DTMF信号 clear clc fs8000; w2*pi/8000*[941 1336;697 1209;697 1336;697 1477; ...770 1209;770 1336;770 1477;852 1209;852 1336;852 1477];%各信号对应的数字频率 tab[2*co…

iOS开发进阶(十三):脚手架创建iOS项目

文章目录 一、前言二、xcode-select 命令三、拓展阅读 一、前言 项目初期&#xff0c;需要搭建项目基本框架&#xff0c;为此离不开辅助工具&#xff0c;即脚手架。当然&#xff0c;IDE也可以实现新建空白项目&#xff0c;但是其新建后的项目结构可能不符合预期设计&#xff0…

权限问题(Windows-System)

方法&#xff1a;用命令来写一个注册表的脚本 &#xff1f;System是最高级用户&#xff0c;但不拥有最高级权限 编写两文档&#xff1a;system.reg 和 remove.reg,代码如下&#xff1a; system.reg&#xff1a; Windows Registry Editor Version 5.00[-HKEY_CLASSES_ROOT\*…

【Qt 学习笔记】认识QtSDK中的重要工具

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 认识QtSDK中的重要工具 文章编号&#xff1a;Qt 学习笔记 / 03 文章目…

图论基础(python蓝桥杯)

图的基本概念 图的种类 怎么存放图呢&#xff1f; 优化 DFS 不是最快/最好的路&#xff0c;但是能找到一条连通的道路。&#xff08;判断两点之间是不是连通的&#xff09; 蓝桥3891 import os import sys sys.setrecursionlimit(100000) # 请在此输入您的代码 n, m map(int,…

什么是工业协议转换软件?

在现代工业自动化领域&#xff0c;随着技术的不断革新和智能化水平的提升&#xff0c;各种工业设备和系统之间的通信变得日益重要。然而&#xff0c;由于历史、技术差异和标准多样化等原因&#xff0c;不同的工业设备和系统往往采用各自独特的通信协议&#xff0c;导致它们之间…

Android Studio 打开Local Changes界面

在编写代码的过程中&#xff0c;经常要回顾本地仓库做了那些修改。打开Local Changes界面&#xff0c;能做到一目了然&#xff0c;不用再去使用git命令查看。 File->Settings->Version control->Commit 把Use non-modal commit interface 选项 取消勾选 即可

如何使用VNC+Cpolar实现Windows电脑公网远程控制Ubuntu系统桌面

文章目录 前言1. VisualSVN安装与配置2. VisualSVN Server管理界面配置3. 安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4. 固定公网地址访问 前言 SVN 是 subversion 的缩写&#xff0c;是一个开放源代码的版本控制系统…

官宣!一文掌握2024百度CreateAI开发者大会最新议程

4月16日上午9:00&#xff0c;以“创造未来”为主题的2024百度Create AI开发者大会将在深圳国际会展中心&#xff08;宝安&#xff09;开幕。此次大会将是近十年来&#xff0c;粤港澳大湾区规格最高的AI大会&#xff0c;将聚焦炙手可热的AI话题&#xff0c;在大会主论坛、分论坛…