Sword38——字符串的排列

Sword38——字符串的排列

方法1——回溯

  • 思路:依次确定每一位可填入的字符,再确定第二位可填入的字符,依次确定下一位可填入的字符
  • 特殊情况与临界分析:无
  • 终止条件:当最后一位字符确定时,即代表此次结果完成
  • 步骤:
    • 定义全局结果List
    • 定义全局字符数组
    • 初始化字符数组,即字符串转换为字符数组
    • 展开递归
    • 返回结果,将List转换为String数组
    • 递归方法
      • 参数:当前正在确定的字符位置下标数
      • 终止条件:当到达最后一个位置
        • 将当前字符数组转换为字符串存储到res中
        • 向上返回
      • 使用HashSet记录已经出现过的字符
      • for循环
        • 参数:从当前idx开始,当i小于字符数组长度
        • 如果HashSet中已包含当前字符,则跳过当前下标对应的操作
        • 无重复字符时,则进行操作
          • 将当前字符加入HashSet
          • 将当前字符固定在字符数组的当前位置
          • 对下一位字符进行操作
          • 撤销固定操作,避免影响向上回溯的结果
	// 定义全局结果List
	List<String> res = new LinkedList<>();
	// 定义全局字符数组
	char[] c;
	public String[] permutation(String s) {
        // 初始化字符数组
        c = s.toCharArray();
        // 展开递归
        dfs(0);
        // 返回结果
        return res.toArray(new String[res.size()]);
    }
	// 递归方法
	private void dfs(int idx) {
        // 终止条件,是否已达最后一个位置
        if (idx == c.length - 1) {
            // 将当前可行结果加入res中保存
            res.add(String.valueOf(c));
            // 向上返回
            return;
        }
        // 定义HashSet
        Set<Character> occ = new HashSet<>();
        // for循环
        for (int i = idx; i < c.length; i++) {
            // 若当前字符已出现在HashSet中
            if (occ.contains(c[i])) {
                // 跳过当前位置的操作
                continue;
            }
            // 将当前字符加入HashSet中
            occ.add(c[i]);
            // 将当前i对应的字符固定在idx处
            swap(i, idx);
            // 对下一位字符进行递归操作
            dfs(idx + 1);
            // 撤销加入的字符,避免影响向上的结果
            swap(i, idx);
        }
    }
	// 交换方法
	private void swap(int i, int j) {
        char tmp = c[i];
        c[i] = c[j];
        c[j] = tmp;
    }

方法1——回溯

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值