java实现字符串排列组合问题

本文为大家介绍了java实现字符串排列组合问题,供大家参考,具体内容如下

import java.util.ArrayList;
import java.util.Collections; 

/**
 * 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,
 * bca,cab和cba。
 *
 * @author pomay
 *
 */
public class Solution_stringarrange
{
 public ArrayList<String> Permutation(String str)
 {
  if (str == null)
   return null;
  ArrayList<String> list = new ArrayList<String>();
  char[] pStr = str.toCharArray(); 

  Permutation(pStr, 0, list);
  Collections.sort(list);
  return list;
 } 

 static void Permutation(char[] str, int i, ArrayList<String> list)
 {
  // 如果为空
  if (str == null)
   return;
  // 如果i指向了最后一个字符
  if (i == str.length - 1)
  {
   if (list.contains(String.valueOf(str)))
    return;
   list.add(String.valueOf(str));
  } else
  {
   // i指向当前我们做排列操作的字符串的第一个字符
   for (int j = i; j < str.length; j++)
   {
    // 把做排列操作的字符串的第一个字符和后面的所有字符交换
    char temp = str[j];
    str[j] = str[i];
    str[i] = temp;
    // 交换后对i后面的字符串递归做排列操作
    Permutation(str, i + 1, list);
    // 每一轮结束后换回来进行下一轮排列操作
    temp = str[j];
    str[j] = str[i];
    str[i] = temp;
   }
  } 

 } 

 public static void main(String[] args)
 {
  String str = "aab";
  Solution_stringarrange changestring = new Solution_stringarrange();
  ArrayList<String> list = changestring.Permutation(str);
  for (int i = 0; i < list.size(); i++)
  {
   System.out.print(list.get(i) + " ");
  }
 }
}

组合:

要么选择长度为n的字符串中的第一个字符,那么要在其余的长度n-1的字符串中选择m-1个字符
要么不选择长度为n的字符串中的第一个字符,那么要在其余的长度n-1的字符串中选择m个字符

import java.util.ArrayList;
import java.util.List; 

/**
 * 输入一个字符串,按字典序打印出该字符串中字符的所有组合。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串a,b,c,ab,ac,bc
 * ,abc 。 求n个字符组成长度为m的组合问题
 *
 * @author pomay
 *
 */
public class Solution_stringcombination
{
 // 求字符串中所有字符的组合abc>a,b,c,ab,ac,bc,abc
 public static void perm(String s)
 {
  List<String> result = new ArrayList<String>();
  // 从一个开始
  for (int i = 1; i <= s.length(); i++)
  {
   combination(s, i, result);
  }
 } 

 // 从字符串s中选择m个字符
 public static void combination(String s, int m, List<String> result)
 {
  // 如果m==0,则递归结束。输出当前结果
  if (m == 0)
  {
   for (int i = 0; i < result.size(); i++)
   {
    System.out.print(result.get(i));
   }
   System.out.print("、");
   return;
  } 

  if (s.length() != 0)
  {
   // 选择当前元素
   result.add(s.charAt(0) + "");
   // substring用法,截取出从1开始到n结束的字符串
   combination(s.substring(1, s.length()), m - 1, result);
   result.remove(result.size() - 1);
   // 不选当前元素
   combination(s.substring(1, s.length()), m, result);
  }
 } 

 public static void main(String[] args)
 {
  String str = "abc";
  perm(str);
 }
}

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

(0)

相关推荐

  • 高效的java版排列组合算法

    本文实例为大家分享了java排列组合算法的具体代码,供大家参考,具体内容如下 package BeanUtil; import java.util.ArrayList; import java.util.List; import com.work.core.exception.OurException; /** * 统计任三出现的最多的几率的组合 * * @author wangmingjie * @date 2009-1-1下午01:22:19 */ public class Copy_2_o

  • 关于各种排列组合java算法实现方法

    一.利用二进制状态法求排列组合,此种方法比较容易懂,但是运行效率不高,小数据排列组合可以使用 复制代码 代码如下: import java.util.Arrays; //利用二进制算法进行全排列//count1:170187//count2:291656 public class test {    public static void main(String[] args) {        long start=System.currentTimeMillis();        count

  • Java排列组合字符串的方法

    例如 输入"abc",打印所有可能出现的组合情况,并且消除重复值. 所谓排列组合如下: 排列组合,字符串:abc bca acb abc cba bac cab 排列组合个数:6 实现代码(结合Java8 lambda表达式实现) import org.junit.Test; import java.util.ArrayList; import java.util.HashSet; import java.util.List; public class test2 { @Test pu

  • Java获得一个数组的指定长度排列组合算法示例

    本文实例讲述了Java获得一个数组的指定长度排列组合算法.分享给大家供大家参考,具体如下: package demo; import java.util.Stack; /** * JAVA获得一个数组的指定长度的排列组合.<br> * * @author JAVA世纪网(java2000.net, laozizhu.com) */ public class TestSequenceAll { public static void main(String[] args) { TestSequen

  • java数组排列组合问题汇总

    面试或笔试中,多次遇到以下4个关于排列组合的手撕算法,这里做个笔记,方法日后查阅: 1. 无重复元素的数组,求全排列: 2. 有重复元素的数组,求全排列: 3. 无重复元素的数组,求组合[子集]: 4. 有重复元素的数组,求组合: 以上四类题,可以用统一的模板实现,如下所示: /* *[组合&&排列] *把一个数组里的数组合全部列出,比如1和2列出来为1,2,12,21. *这个题目可以扩展成四个: *1.无重复数字的数组,求组合 *2.有重复数字的数组,求组合 *3.无重复数字的数组,求

  • Java实现abc字符串排列组合

    1.可重复排列:abc三个字符组成的所有长度为3的字符串,aaa,aab,aac......ccc 一共27种 利用递归的思想,第一个字符可以从abc中选择一个,三种选择,之后问题转化为abc组成长度为2的字符的情况,循环递归后可以求出所有的可能.控制好循环退出条件即可. 利用递归可以处理,不知道字符长度的情况下,即通用处理.如果知道长度,只需要利用多层循环,也可以得出结论. public class Permutation { public static void main(String[]

  • Java实现多个数组间的排列组合

    Java多个数组之间的排列组合,具体内容如下 说明:有一批手机有各种颜色.各种尺寸.各种版本,然后要实现他们之间各种属性的组合. 定义各种属性 String[] color={"红色","白色","蓝色","金色"}; String[] size={"4.7寸","5.1寸","6.0寸"}; String[] version={"联通",&quo

  • Java递归实现字符串全排列与全组合

    排列组合算法用途广泛,需要掌握,为降低门槛,本文主要关注算法的逻辑和简易性,未重视算法效率. 结合网络书本上的实现和自己的需求,这里列有四个目标: 1. 所有元素的全排列: ab的全排列是ab, ba(顺序相关); 2. 所有元素的全组合: ab的全组合是a, b, ab(顺序无关); 3. 求n个元素中选取m个元素的组合方式有哪些: abc中选2个元素的组合是ab, ac, bc; 4. 求n个元素中选取m个元素的排列方式有哪些: abc中选2个元素的排列是ab, ba, ac, ca, bc

  • java实现字符串排列组合问题

    本文为大家介绍了java实现字符串排列组合问题,供大家参考,具体内容如下 import java.util.ArrayList; import java.util.Collections; /** * 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac, * bca,cab和cba. * * @author pomay * */ public class Solution_stringarrange

  • java实现字符串的全排列

    字符串的全排列,具体内容如下 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 结果请按字母顺序输出. 采用递归的思想: 把需要全排列的字符串分为两部分看待: (1)字符串的第一个字符: (2)第一个字符后面的所有字符: 求所有可能出现在第一个位置的字符:将第一个字符和后面的字符一次交换: 固定第一个字符,对第一个字符后面的所有字符求全排列.第一个字符后面的所有字符又可以

  • C#查找字符串所有排列组合的方法

    本文实例讲述了C#查找字符串所有排列组合的方法.分享给大家供大家参考.具体实现方法如下: // 1. remove first char // 2. find permutations of the rest of chars // 3. Attach the first char to each of those permutations. // 3.1 for each permutation, move firstChar in all indexes // to produce even

随机推荐