【剑指offer】-字符串的排列-26/67

简介: 【剑指offer】-字符串的排列-26/67

1. 题目描述

输入一个字符串,按字典序打印出该字符 串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

2. 输入描述

输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

3. 题目分析

  1. 经典的一道全排列算法的题目
  2. 全排列算法
  3. 这里以A{a,b,c}为例,来说明全排列的生成方法,对于这个集合,其包含3个元素,所有的排列情况有3!=6种,对于每一种排列,其第一个元素有3种选择a,b,c,对于第一个元素为a的排列,其第二个元素有2种选择b,c;第一个元素为b的排列,第二个元素也有2种选择a,c,……,依次类推,我们可以将集合的全排列与一棵多叉树对应。如下图所示

4. 题目代码

public ArrayList<String> Permutation(String str) {
    ArrayList<String> strings = new ArrayList<String>();
    if (str == null || str.length() == 0) {
      return strings;
    }
    char[] string = str.toCharArray();
    perm(strings, string, 0, string.length - 1);
    Collections.sort(strings);
    return strings;
  }
  public static void perm(ArrayList<String> strings, char[] a, int k, int m ) {
    if (k == m) {
      String str = String.valueOf(a);
      if (strings.contains(str) == false) {
        strings.add(str);
      }
    } else {
      /*
       * 进入时 
       */
      for (int i = k; i <= m; i++) {
        swap(a, i, k);
        perm(strings, a, k + 1, m);
        // 回溯
        swap(a, i, k);
      }
    }
  }
  public static void swap(char[] a, int x1, int x2) {
    char temp;
    temp = a[x1];
    a[x1] = a[x2];
    a[x2] = temp;
  }


相关文章
|
机器学习/深度学习 自然语言处理 索引
深度学习:Self-Attention与Multi-heads Attention详解
深度学习:Self-Attention与Multi-heads Attention详解
654 0
深度学习:Self-Attention与Multi-heads Attention详解
|
Linux Shell
阿里云服务器+安装宝塔
阿里云服务器+安装宝塔
786 1
阿里云服务器+安装宝塔
|
Android开发
教你在Android手机上使用全局代理!
前言:在Android上使用系统自带的代理,限制灰常大,仅支持系统自带的浏览器。这样像QQ、飞信、微博等这些单独的App都不能使用系统的代理。如何让所有软件都能正常代理呢?ProxyDroid这个软件能帮你解决!使用方法及步骤如下: 一、推荐从Google Play下载ProxyDroid,目前最新版本是v2.6.6。
16587 0
|
SQL 分布式计算 数据库
畅捷通基于Flink的实时数仓落地实践
本文整理自畅捷通总架构师、阿里云MVP专家郑芸老师在 Flink Forward Asia 2023 中闭门会上的分享。
8436 15
畅捷通基于Flink的实时数仓落地实践
|
人工智能 供应链 监控
人力资源数智化正当时,何以引领企业跨越人才管理新高度?
人力资源数智化正当时,何以引领企业跨越人才管理新高度?
439 0
人力资源数智化正当时,何以引领企业跨越人才管理新高度?
|
存储 关系型数据库 对象存储
实时计算 Flink版操作报错合集之变更数据流转换为Insert-Only记录时,报错"datastream api record contains: Delete"如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
237 1
|
11月前
|
XML 前端开发 JavaScript
Nginx 安装配置
10月更文挑战第5天
196 4
Nginx 安装配置
|
11月前
|
JavaScript 前端开发 索引
JavaScript ES6及后续版本:新增的常用特性与亮点解析
JavaScript ES6及后续版本:新增的常用特性与亮点解析
352 4
|
10月前
|
安全 算法 编译器
.NET 9 AOT的突破 - 支持老旧Win7与XP环境
【10月更文挑战第30天】在.NET 9 中,AOT(Ahead-of-Time)编译技术在支持老旧的 Windows 7 和 XP 系统方面取得了显著进展。主要突破包括:性能提升(启动速度加快、执行效率提高)、部署优化(无需安装.NET 运行时、减小应用程序体积)、兼容性保障(编译策略优化、依赖项管理改进)以及安全性增强(代码保护机制)。这些改进使得应用程序在老旧系统上运行更加流畅、高效和安全。
357 2
|
消息中间件 存储 机器人
Flink执行问题之执行checkpoint失败如何解决
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。本合集提供有关Apache Flink相关技术、使用技巧和最佳实践的资源。

热门文章

最新文章