有重复字符串的排列组合

题目链接

有重复字符串的排列组合

题目描述

注意点

  • 字符都是英文字母
  • 字符串长度在[1, 9]之间

解答思路

  • 本题与无重复字符串的排列组合类似,区别是字符串中有重复字符,所以组合数量不会是固定的n * (n - 1) * (n - 2) * ... * 1
  • 首先想到的仍然是深度优先遍历,区别是结果集中同一个位置相同的字符只能添加一次(字符可能在s的不同位置),所以可以使用map存储每个字符和字符的出现次数,对每个位置需要加入的字符可以遍历map的key集合,每个位置能否加入字符c可以根据上一次dfs传入的map.get©判断是否还有剩余的c可以使用

代码

java 复制代码
class Solution {
    int n;
    public String[] permutation(String s) {
        n = s.length();
        List<String> list = new ArrayList<>();
        Map<Character, Integer> map = new HashMap<>();
        for (char c : s.toCharArray()) {
            map.put(c, map.getOrDefault(c, 0) + 1);
        }
        dfs(s, 0, map, new StringBuilder(), list);
        return list.toArray(new String[list.size()]);
    }

    public void dfs(String s, int depth, Map<Character, Integer> map, StringBuilder sonRes, List<String> list) {
        if (depth >= n) {
            list.add(sonRes.toString());
            return;
        }
        for (Character c : map.keySet()) {
            if (map.get(c) == 0) {
                continue;
            }
            sonRes.append(c);
            map.put(c, map.get(c) - 1);
            dfs(s, depth + 1, map, sonRes, list);
            sonRes.deleteCharAt(sonRes.length() - 1);
            map.put(c, map.get(c) + 1);
        }
    }
}

关键点

  • 深度优先遍历的思想
  • 保证结果集中每个位置相同的字符只会考虑一次
相关推荐
budingxiaomoli14 小时前
SpringCloud概述
java·spring cloud·微服务
阿Y加油吧14 小时前
二刷 LeetCode:198. 打家劫舍 & 279. 完全平方数 复盘笔记
笔记·算法·leetcode
绿草在线14 小时前
基于SpringBoot4+Mybatis+Thymeleaf的用户管理系统开发实战
java·spring boot·thymeleaf
承渊政道14 小时前
【动态规划算法】(子序列问题解题框架与典型案例)
数据结构·c++·学习·算法·leetcode·macos·动态规划
阿Y加油吧14 小时前
二刷 LeetCode:215. 数组中的第 K 个最大元素 & 347. 前 K 个高频元素 复盘笔记
笔记·leetcode·排序算法
鸟儿不吃草14 小时前
Android Java 自定义TextView点击取词,类似百度翻译的点击一段英文中的某个单词,可以显示点击了哪个单词
android·java·开发语言
_F_y14 小时前
仿RabbitMQ实现消息队列-服务端核心模块实现(3)
c++·算法·rabbitmq
m0_6294947314 小时前
LeetCode 热题 100-----15.轮转数组
数据结构·算法·leetcode
AI科技星14 小时前
从180°旋转定值π、e论证时空宿命与未来可预测性—全域数学视角
人工智能·算法·机器学习·数学建模·数据挖掘
WL_Aurora14 小时前
Python 算法基础篇之栈和队列
python·算法