范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

常考算法题无重复字符串的排列组合

  大家好我西瓜哥,今天做一道比较常考的算法题。
  编写一种方法,计算某字符串的所有排列组合,字符串每个字符均不相同。
  如输入  "qwe" ,要求返回 ["qwe", "qew", "wqe", "weq", "ewq", "eqw"]  。
  LeetCode 题目链接:
  https://leetcode-cn.com/problems/permutation-i-lcci/  回溯解法
  常见的解法是回溯。
  我们使用一个 toVisited 数组,用于维护递归过程中尚未访问的字符。
  回溯函数的 TypeScript 签名如下:  (combs: string[], s: string, toVisit: string[]) => void combs:字符串数组。排列组合被保存的数组,回溯结束后用于返回 s:字符串 toVisit:尚未访问的字符数组。
  先看下回溯函数的代码实现。  function r(combs, s, toVisit) {   if (toVisit.length === 0) {     combs.push(s);     return;   }   for (let i = 0; i < toVisit.length; i++) {     r(combs, s + toVisit[i], toVisit.filter(item => item != toVisit[i]));   } }
  我们会遍历 toVisit 数组,将这些尚未被访问的字符,追加到 s 末尾,然后生成一个新的移除了该字符的 toVisited,作为下一个递归调用的参数。
  当所有字符都被访问过了(toVisite 数组为空)时,我们就拿到了一种排列方式,将它放到 combs,然后结束当前的这一个迭代。
  当所有的迭代都结束后,我们的 combs 中就包含了所有的排列,将其返回即可。
  完整代码实现如下:  function permutation(S: string): string[] {   const combs = [];   r(combs, "", [...S]);   return combs; };  function r(combs: string[], s: string, toVisit: string[]) {   if (toVisit.length === 0) {     combs.push(s);     return;   }   for (let i = 0; i < toVisit.length; i++) {     r(combs, s + toVisit[i], toVisit.filter(item => item != toVisit[i]));   } }
  我们注意到,每次递归,都要拷贝一份待访问字符数组,即  toVisit.filter(item => item != toVisit[i]) ,这个效率实在是不怎么高啊。
  其实这个可以优化一下。如果你实现过排序算法,比如选择排序,你就会想到一个原地使用原数组的思路。排序算法中将原数组的元素进行交换,分为 "排序区间" 和 "未排序区间"。
  我们这里也可以致敬一下,也交换一下嘛, 在原数组中原地分为 "已访问字符区间" 和 "待访问数组" 。然后在下一个递归函数执行完后,再复原一下数组。
  改良后的实现如下:  function permutation(S): string[] {   const combs = [];   r(combs, [...S], 0);   return combs; };  function r(combs, chars, first) {   if (first === chars.length) {     combs.push(chars.join(""));     return;   }   for (let i = first; i < chars.length; i++) {     swap(chars, i, first);     r(combs, chars, first + 1);     swap(chars, i, first);   } }  function swap(chars, i, j) {   const tmp = chars[i];   chars[i] = chars[j];   chars[j] = tmp; } 结尾
  本文讲解了如何用回溯的思考解全排列问题,回溯解法的核心思路是每次迭代,从待访问字符集中挑选字符,直到所有字符都被访问完。
  为此你需要维护待访问字符集数组,这里如果想要高效一些,可以使用数组原地分区或是使用栈的方式,直接拷贝一份效率很低,但优点是简单直接(所以我做题时经常这么干)
  我是每周做五道算法题的前端西瓜哥,欢迎关注我。

聊什么推什么?你的手机被谁监控了?随口提上两个品牌低头刷新下,手机广告随之匹配和朋友聚会,聊到火锅下一秒,APP上满是附近火锅店推荐甚至想换双拖鞋,APP都能精准定位好像未卜先知一般及时为你推送你是否也有这样的经历雷军为啥这么拼?出道32年坐拥4家上市公司,还赌上一切要造车1995年,周鸿祎在方正做程序员,每天要挤3小时公交上班。他已经坐镇北京金山,开着白色桑塔纳穿梭于街巷,如同今天开着卡宴。他是出道较早的老革命,中关村的初代创业者。用世俗的标准来说256GB66W快充,144Hz屏骁龙888,已降价1200元Tech分析狮3月20日,一般情况下,作为一款超高端的旗舰手机,它的降价不会太着急,而且即使是要降价,它的降价幅度也不会太大。然而,随着各大手机厂商内卷严重,竞争进一步加剧,这使得TCL75V6电视都有哪些优点?TCL电视75V6TCL电视75V675英寸AI声控智慧屏216GB全面屏电视4K智能电视机以旧换新TCL电视75V675英寸AI声控智慧屏216GB全面屏电视4K智能电视机以旧换2021全球畅销手机榜单出炉三星A12居榜首小米成唯一国产品牌日前,市调机构Omdia发布2021年第四季度智能手机市场追踪报告,同时公布了2021年全球最畅销10款手机。榜单显示,三星GalaxyA12力压iPhone12,凭借5180万台别瞧不上千元机,贵的不一定好用,目前这4款手机足够使用了如果预算充足,谁都喜欢苹果旗下的iPhone或者安卓超级旗舰,但事实是并不是每一个人在计划换新的时候都拥有足够高的预算,甚至于次旗舰都让他们望而却步,更多时候他们的购机目标就是千元realme新品预热目前最轻薄的天玑8100旗舰realme对标RedmiK50的新机GTNeo3将于明天1400正式发布,今日官方继续为这款新机带来预热。realme真我手机官方微博发文称做最轻薄的潮玩电竞旗舰!188g超轻玻不知从什么时候开始,坊间一直流传着这么一个内容不知从什么时候开始,坊间一直流传着这么一个内容苹果手机比安卓流畅,苹果手机比安卓安全,比安卓用的时间久,苹果产品体验比安卓好,等等各种所谓的优点各位朋友们,醒醒吧!都2022年了,iOS15。4翻车了,你更新了吗?上周二苹果推送了大家期待已久的iOS15。4正式版,新系统主要带了戴口罩解锁iPhone功能,但仅支持A14和A15设备,也就是iPhone12和iPhone13系列设备,因此相信有哪些高颜值小家电值得买?这6件真的不错,精致又实用现在小家电发展非常迅速,涌现出了许多样式和功能都非常新奇的设计,很多高颜值功能强的小家电真的是让人有种买买买的冲动。那么,有哪些高颜值小家电值得买呢?话不多说,今天咱们就来推荐一些iPhoneSE3基本确定4。7英寸LCD屏幕5G网络,升级点并不是很多凭借者亲民的价格和耐用的特点,iPhoneSE系列手机一直是受到消费者的热捧,导致每年苹果春节发布会前,都有新一代SE发布的传言,当然今年也是。而根据目前掌握的信息来看,全新一代的
新机谍中谍vivoX80全系高配4月25日发布新机谍中谍栏目中谍中谍寓意谍报中的谍报,在新机发布之前,让我们用专业的眼光风趣幽默的文字,告诉你新机谍报中的那些真真假假,提前为你揭秘即将发布的重磅新机当中可能存在的那些新科技。vOracle与mysql数据库相比到底强在哪里事实上很多应用项目,刚起步的时候用MYSQL数据库基本上能实现各种功能需求,随着应用用户的增多,数据量的增加,MYSQL渐渐地出现不堪重负的情况连接很慢甚至宕机,于是就有把数据从M外媒传来新消息,张忠谋终于还是摊牌了文北桥校对北桥面对华为麒麟芯片的难产与新能源汽车的芯片短缺等等问题,芯片在未来的地位越来越重要,芯片俨然已经成为了兵家必争之地。显而易见的是国内在短时间内仍然被光刻机与芯片制程所困5G手机续航王,2K屏幕5500mAh超大电池仅2399元,还有天玑8100自从进入到5G手机时代后,用户对于电池容量的要求更高,此前卢伟冰在微博上曾表示过5G旗舰手机如果5G网络全开,大约功耗高于4G手机20。另外不仅5G网络传输更高,高刷屏的兴趣也是带手机不用时,屏幕最好朝下放!错误的习惯会毁掉手机,赶紧改正手机已经成为我们生活的必需品,无论走到哪,都会把手机带在身边,有手机在外面也很方便,而且还能看看短视频刷刷资讯消磨无聊的时光,而不用的时候,可能会随便放在口袋或者桌子上。很多人不会刚刚红米K50SK50SPro首曝,处理器又升级当前,RedmiK50家族有三款,分别是搭载骁龙8Gen1的K50电竞版天玑8100的K50以及天玑9000的K50Pro。即便是最早登场的K50电竞版,也才不过推出两个月时间。意iPhone有哪些引以为傲的黑科技APP?随着互联网技术的迅速革新,手机智能化程度越来越高,各种各样的手机APP应用也变得越来越多,但是在用户的实际使用中对手机的黑科技要求也越来越高,追求个性化成为了一种使用常态。下面就为又有App被点名!这17款国家计算机病毒应急处理中心近期通过互联网监测发现17款移动App存在隐私不合规行为,违反网络安全法个人信息保护法等相关规定,涉嫌超范围采集个人隐私信息。未向用户明示申请的全部隐私权张忠谋再次发声!外媒台积电等于是摊牌了点击关注,每天精彩不断!导读张忠谋再次发声!外媒台积电等于是摊牌了!众所周知,半导体芯片是现代科技领域发展的核心,在整个科技领域发挥着极其重要的作用,但是在老美的干预下,芯片规则多做一个机械工程师,SolidWorks和Proe相比,更应该去学习哪个?其实用那个软件不重要,软件只是一个工具,再华丽的软件如果没有扎实的对机械的理解的基础,也是空谈我当时上学的也时候,也是追求各种软件,solidworkCATIAUGansys都学过耳机新体验,不震不痒不压耳,挂脖一天不想摘耳机已是人们生活的必需品,出镜率仅次于手机,品牌多样式多到琳琅满目,款式有有线无线入耳半入耳骨传导气传导,这些种耳机我都使用过,目前看最喜欢的还是气传导耳机。也可能是因为自己耳型的