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

福州专业网站建设服务商网站收录工具

福州专业网站建设服务商,网站收录工具,做网站优化多少钱,网站开发团队哪些人某店铺将用于组成套餐的商品记作字符串 goods,其中 goods[i] 表示对应商品。请返回该套餐内所含商品的 全部排列方式 。 返回结果 无顺序要求,但不能含有重复的元素。 示例 1: 输入:goods "agew" 输出:[&…

某店铺将用于组成套餐的商品记作字符串 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"]

LCR 157. 套餐内商品的排列顺序 - 力扣(LeetCode)

很经典的回溯题目

我们回顾一下回溯三部曲:

void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯,撤销处理结果}
}

第一次写的时候忘记去掉重复元素了,但是回溯基本上是对的,没有加剪枝:

class Solution {public String[] goodsOrder(String goods) {if(goods == null){return new String[0];}ArrayList<String> results = new ArrayList<>();StringBuilder result = new StringBuilder();backtracing(result,goods,results);return results.toArray(new String[0]);}public void backtracing(StringBuilder result, String goods, ArrayList<String> results){if(result.length() == goods.length()){results.add(result.toString());return;}for(int i = 0; i < goods.length(); i++){result = result.append(goods.charAt(i));backtracing(result,goods,results);result = result.deleteCharAt(result.length() - 1);}}
}

使用HashSet,并使用used数组记录该元素是否被使用过:

class Solution {public String[] goodsOrder(String goods) {if(goods == null){return new String[0];}HashSet<String> results = new HashSet<>();StringBuilder result = new StringBuilder();boolean[] used = new boolean[goods.length()]; // 记录字符是否被使用过backtracing(result,goods,results,used);return results.toArray(new String[0]);}public void backtracing(StringBuilder result, String goods, HashSet<String> results,boolean[] used){if(result.length() == goods.length()){results.add(result.toString());return;}for(int i = 0; i < goods.length(); i++){if (used[i]) {continue;}used[i] = true;result = result.append(goods.charAt(i));backtracing(result,goods,results,used);result = result.deleteCharAt(result.length() - 1);used[i] = false;}}
}

其实还有一个问题,像刚才上面的算法,如果是abb这样的字符串,其实是会产生两个abb的,但是我们用HashSet过滤掉了。但是这样会导致算法性能不太好。应该加上这样一个条件判断更合适:

if (i > 0 && goods.charAt(i) == goods.charAt(i - 1) && !used[i - 1]) {continue;
}

如果当前字符等于上一个字符并且上一个字符没有被使用过,那么就跳过。

但是好像在力扣里加不加这个算法性能没太大区别。

http://www.dtcms.com/wzjs/261936.html

相关文章:

  • 网站建设一般都需要什么资质seo方法
  • 成都十大猎头公司seo优化及推广如何运营
  • 拓者设计吧注册码必须买吗沧州seo推广
  • 网站建设 需要注意什么朝阳seo
  • 百捷网站建设长沙关键词优化平台
  • 北京宏福建设工程有限公司网站中国舆情在线
  • 代驾网站开发seo优化分析
  • 网站建设教材重庆seo整站优化
  • mac wordpress ftp南昌seo搜索优化
  • 淘宝上面建设网站安全么网站优化 秦皇岛
  • 餐饮网站开发性能需求广州百度推广客服电话
  • wordpress企业网站定制教程 一百度快照客服电话
  • 听完米课做的网站西安seo关键词查询
  • 厦门做网站找哪家公司百度sem竞价推广
  • 家装设计网站大全网站推广的方式有哪些
  • 用htmlseo检查工具
  • 各大公司官网泉州关键词优化软件
  • 徐州网站个人建网站的详细步骤
  • 网站建设海南合肥网站优化平台
  • 怎么和其它网站做友情链接网址大全123
  • 制作科技网站首页百度是国企还是央企
  • wordpress 修改html代码电脑系统优化工具
  • 做响应式网站有什么插件十大中文网站排名
  • 网站源码多少钱国际新闻网站
  • 网络营销型企业网站案例b站推广网站入口2023的推广形式
  • wordpress搜索页面怎么仿seo排名优化培训价格
  • 织梦网站安装教程外贸seo公司
  • 简单asp网站源码营销渠道有哪些
  • 怎样做投资与理财网站seo关键词排名在线查询
  • 个人做网站需要注意什么百度客服联系方式