Java递归基础案例-字符串全排列-三星提示(背下公式)

简介: Java递归基础案例-字符串全排列-三星提示(背下公式)

题目解析

字符串数组中每次选取一个元素,作为结果中的第一个元素;然后,对剩余的元素全排列

全排列

从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。


公式:全排列数f(n)=n!(定义0!=1)


例如:如果是对任意的三个字符进行全排列,也就是3!=6,当然,如果是相同的就只有1次


String s="我爱你";

三个字符,全排列,6中结果


我爱你

我你爱

爱我你

爱你我

你爱我

你我爱


三个相同字符串,就一次


爱爱爱


那么我们要编辑出这种排列方法:


package Action;
public class test {
  public static void main(String[] args) {
  String s = "我爱你";
  char[] array = s.toCharArray();
  int count=0;
  //"字符串不能完全相同"判断
  for (int i = 0; i < array.length-1; i++) {
    if(array[i]==array[i+1]) {
    count++;
    }
  }
  if(count==array.length-1) {
    System.out.println(s);
    return;
  }
  // 通过字符处理
  f(s.toCharArray(), 0, s.length() - 1);
  }
  public static void f(char[] s, int from, int to) {
  if (from == to) {//递归终止条件
    System.out.println(s);//打印结果
  } else {
    // 从from开始,循环到to结束
    for (int i = from; i <= to; i++) {
    change(s, i, from); //交换前缀,作为结果中的第一个元素,然后对剩余的元素全排列
    f(s, from + 1, to); //递归调用,缩小问题的规模,form每次+1
    change(s, from, i); //换回前缀,复原字符数组
    }
  }
  }
  /**
  * 用于交换的
  * 
  * @param s
  * @param from
  * @param to
  */
  public static void change(char[] s, int from, int to) {
  char temp = s[from];// 定义第三方temp,获取from
  s[from] = s[to];// 从to交换到from
  s[to] = temp;// 从temp还给to
  }
}



image.png

这个理解难度也就大了。


希望大家一定要好好看完啊,并且真正的去练习个十几二十遍的,最好背下来这个用法。


相关文章
|
2月前
|
SQL Java 索引
java小工具util系列2:字符串工具
java小工具util系列2:字符串工具
148 83
|
2月前
|
存储 安全 Java
Java零基础-字符串详解
【10月更文挑战第18天】Java零基础教学篇,手把手实践教学!
113 60
|
2月前
|
Java 数据库
java小工具util系列1:日期和字符串转换工具
java小工具util系列1:日期和字符串转换工具
61 26
|
2月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
66 8
|
2月前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
54 6
|
2月前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
84 3
|
2月前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
73 2
|
2月前
|
Java 关系型数据库 数据库
面向对象设计原则在Java中的实现与案例分析
【10月更文挑战第25天】本文通过Java语言的具体实现和案例分析,详细介绍了面向对象设计的五大核心原则:单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则帮助开发者构建更加灵活、可维护和可扩展的系统,不仅适用于Java,也适用于其他面向对象编程语言。
46 2
|
3月前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
27 1
|
3月前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
【10月更文挑战第8天】本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
48 5