Java实现abc字符串排列组合

 更新时间:2018年02月05日 08:40:19   作者:zhenxianyimeng  
这篇文章主要为大家详细介绍了JAVA实现abc字符串的排列组合,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

1.可重复排列:abc三个字符组成的所有长度为3的字符串,aaa,aab,aac......ccc 一共27种

利用递归的思想,第一个字符可以从abc中选择一个,三种选择,之后问题转化为abc组成长度为2的字符的情况,循环递归后可以求出所有的可能。控制好循环退出条件即可。

利用递归可以处理,不知道字符长度的情况下,即通用处理。如果知道长度,只需要利用多层循环,也可以得出结论。

public class Permutation { 
 public static void main(String[] args) { 
  char[] chs = {'a','b','c'}; 
  per(new char[3], chs, 3-1); 
 } 
 public static void per(char[] buf, char[] chs, int len){ 
  if(len == -1){ 
   for(int i=buf.length-1; i>=0; --i) 
    System.out.print(buf[i]); 
   System.out.println(); 
   return; 
  } 
  for(int i=0; i<chs.length; i++){ 
   buf[len] = chs[i]; 
   per(buf, chs, len-1); 
  } 
 } 
} 

可重复选择,一共27种情况,结果如下图所示

2.全排列:还是abc三个字符,全排列即字符不能重复。最后 3*2 =6种结果

可以利用1中的方法,只要判断3个字符是否相等,都不相等的才是需要的全排列里的一个。这样的时间复杂度为n^n,而全排列的种类为n!所以需要设计一种n!的算法。

也可以利用递归,第一个字符串一共有n种选择,剩下的变成一个n-1规模的递归问题。而第一个字符的n种选择,都是字符串里面的。因此可以使用第一个字符与1-n的位置上进行交换,得到n中情况,然后递归处理n-1的规模,只是处理完之后需要在换回来,变成原来字符的样子。

public class Arrange { 
 public static void main(String[] args) { 
  char[] chs = {'a','b','c'}; 
  arrange(chs, 0, chs.length); 
 } 
 public static void arrange(char[] chs, int start, int len){ 
  if(start == len-1){ 
   for(int i=0; i<chs.length; ++i) 
    System.out.print(chs[i]); 
   System.out.println(); 
   return; 
  } 
  for(int i=start; i<len; i++){ 
   char temp = chs[start]; 
   chs[start] = chs[i]; 
   chs[i] = temp; 
   arrange(chs, start+1, len); 
   temp = chs[start]; 
   chs[start] = chs[i]; 
   chs[i] = temp; 
  } 
 } 
} 

运行结果如下图所示,一共6种组合

3.组合:abc三个字符的所有组合

求所有组合也就是abc各个位是否选取的问题,第一位2中可能,第二位2种。。。所以一共有2^n种。用0表示不取,1表示选取,这样可以用110这样的形式表示ab。abc一共的表示形式从0到2^3-1。然后按位与运算,如果结果为1就输出当前位,结果0不输出。

public class Comb { 
 public static void main(String[] args) { 
  char[] chs = {'a','b','c'}; 
  comb(chs); 
 } 
 
 public static void comb(char[] chs) { 
  int len = chs.length; 
  int nbits = 1 << len; 
  for (int i = 0; i < nbits; ++i) { 
   int t; 
   for (int j = 0; j < len; j++) { 
    t = 1 << j; 
    if ((t & i) != 0) { // 与运算,同为1时才会是1 
     System.out.print(chs[j]); 
    } 
   } 
   System.out.println(); 
  } 
 } 
} 

输出结果如下,第一行为空,表示一个都不取

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Spring使用注解存储Bean对象的方法详解

    Spring使用注解存储Bean对象的方法详解

    在使用学习使用 Spring过程中,当我们要实现一个功能的时候,先应该考虑的是有没有相应的注解是实现对应功能的,Spring 中很多功能的配置都是可以依靠注解实现的,而本篇中介绍的是使用注解来存储 Bean 对象
    2023-07-07
  • 关于SpringBoot中的请求映射及使用

    关于SpringBoot中的请求映射及使用

    这篇文章主要介绍了关于SpringBoot中的请求映射及使用,Spring Boot 中的授权机制,包括基于角色的授权和基于资源的授权,同时,我们也将给出相应的代码示例,帮助读者更好地理解和应用这些授权机制,需要的朋友可以参考下
    2023-07-07
  • log4j2.xml文件详解及在日志中加入全局guid

    log4j2.xml文件详解及在日志中加入全局guid

    这篇文章主要介绍了log4j2.xml文件详解及在日志中加入全局guid,基于很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • SSM使用mybatis分页插件pagehepler实现分页示例

    SSM使用mybatis分页插件pagehepler实现分页示例

    本篇文章主要介绍了SSM使用mybatis分页插件pagehepler实现分页示例,使用分页插件的原因,简化了sql代码的写法,实现较好的物理分页,非常具有实用价值,需要的朋友可以参考下
    2018-03-03
  • Mybatis查询返回两个或多个参数问题

    Mybatis查询返回两个或多个参数问题

    这篇文章主要介绍了Mybatis查询返回两个或多个参数问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Java反射机制用法总结

    Java反射机制用法总结

    反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。下面我们来一起学习一下吧
    2019-05-05
  • Springboot Thymeleaf字符串对象实例解析

    Springboot Thymeleaf字符串对象实例解析

    这篇文章主要介绍了Springboot Thymeleaf字符串对象实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2007-09-09
  • 关于文件上传MultipartBody的使用方法

    关于文件上传MultipartBody的使用方法

    这篇文章主要介绍了关于文件上传MultipartBody的使用方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Java8加java10等于Java18的版本查看及特性详解

    Java8加java10等于Java18的版本查看及特性详解

    这篇文章主要为大家介绍了Java 8加java10等于Java18的各个版本要点详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • JavaWeb 入门:Hello Servlet

    JavaWeb 入门:Hello Servlet

    这篇文章主要介绍了Servlet开发JavaWeb工程示例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07

最新评论