Java实现字符串的全排列
1 问题描述
输入一个字符串,打印出该字符串的所有排列。例如,输入字符串”abc”,则输出有字符’a’,’b’,’c’所能排列出来的所有字符串”abc”,”acb”,”bac”,”bca”,”cab”,”cba”。
2 解决方案
2.1 递归实现
从字符串中选出一个字符作为排列的第一个字符,然后对剩余的字符进行全排列。如此递归处理,从而得到所有字符的全排列。
package com.liuzhen.string_1;
public class StringArrange {//方法1:递归实现
/*
* 参数arrayA:给定字符串的字符数组
* 参数start:开始遍历字符与其后面各个字符将要进行交换的位置
* 参数end:字符串数组的最后一位
* 函数功能:输出字符串数字的各个字符全排列
*/
public void recursionArrange(char[] arrayA,int start,int end){
if(end <= 1)
return;
if(start == end){
for(int i = 0;i < arrayA.length;i++)
System.out.print(arrayA[i]);
System.out.println();
}
else{
for(int i = start;i <= end;i++){
swap(arrayA,i,start);
recursionArrange(arrayA,start+1,end);
swap(arrayA,i,start);
}
}
}
//交换数组m位置和n位置上的值
public void swap(char[] arrayA,int m,int n){
char temp = arrayA[m];
arrayA[m] = arrayA[n];
arrayA[n] = temp;
}
public static void main(String[] args){
StringArrange test = new StringArrange();
String A = "abc";
char[] arrayA = A.toCharArray();
test.recursionArrange(arrayA,0,arrayA.length-1);
}
}
运行结果:
abc
acb
bac
bca
cba
cab
2.2 字典序排列实现
思想如下:
(1)找到排列中最后(最右)一个升序的首位位置i。
(2)找到排列中第i位右边最后一个比ai大的位置j。
(3)交换ai和aj的值。
(4)把第i+1位到最后一位的部分进行逆序反转。
package com.liuzhen.string_1;
public class StringArrange {
//方法2:字典序排列
/*
* 参数arrayA:给定字符串的字符数组
* 函数功能:输出字符串数组的所有字符的字典序全排列
*/
public void dictionaryArrange(char[] arrayA){
System.out.println(String.valueOf(arrayA));
while(allArrange(arrayA))
System.out.println(String.valueOf(arrayA));
}
//判断当前数组arrayA序列是否可以进行字典序排列,如可以则进行排列并返回true,否则返回false
public boolean allArrange(char[] arrayA){
int i;
for(i = arrayA.length-2;(i >= 0) && arrayA[i] > arrayA[i+1];--i);
if(i < 0)
return false;
int k;
for(k = arrayA.length-1;(k > i) && arrayA[i] >= arrayA[k];--k);
swap(arrayA,i,k);
reverseArray(arrayA,i+1,arrayA.length-1);
return true;
}
//将数组中a[m]到a[n]一段元素反序排列
public void reverseArray(char[] arrayN,int m,int n){
while(m < n){
char temp = arrayN[m];
arrayN[m++] = arrayN[n];
arrayN[n--] = temp;
}
}
//交换数组m位置和n位置上的值
public void swap(char[] arrayA,int m,int n){
char temp = arrayA[m];
arrayA[m] = arrayA[n];
arrayA[n] = temp;
}
public static void main(String[] args){
StringArrange test = new StringArrange();
String A = "abc";
char[] arrayA = A.toCharArray();
test.dictionaryArrange(arrayA);
}
}
运行结果:
abc
acb
bac
bca
cab
cba
Java实现字符串的全排列的更多相关文章
- 【算法与数据结构】Java实现字符串的全排列及组合
注:本文记录了代码编写及调试过程,想直接浏览正确答案的请移步文章结尾. 一.字符串的全排列问题 1. 下面是最初的代码(答案有错误-重复输出) import java.util.Scanner; pu ...
- Java常量字符串String理解
Java常量字符串String理解 以前关于String的理解仅限于三点:1.String 是final类,不可继承2.String 类比较字符串相等时时不能用“ == ”,只能用 "eq ...
- Java String字符串/==和equals区别,str。toCharAt(),getBytes,indexOf过滤存在字符,trim()/String与StringBuffer多线程安全/StringBuilder单线程—— 14.0
课程概要 String 字符串 String字符串常用方法 StringBuffer StringBuilder String字符串: 1.实例化String对象 直接赋值 String str=& ...
- 28. 字符串的全排列之第2篇[string permutation with repeating chars]
[本文链接] http://www.cnblogs.com/hellogiser/p/string-permutation-with-repeating-chars.html [题目] 输入一个字符串 ...
- java截取字符串中的数字
java从字符串中提取数字 随便给你一个含有数字的字符串,比如: String s="eert343dfg56756dtry66fggg89dfgf"; 那我们如何把其中的数字提取 ...
- 三张图彻底了解Java中字符串的不变性
转载: 三张图彻底了解Java中字符串的不变性 定义一个字符串 String s = "abcd"; s中保存了string对象的引用.下面的箭头可以理解为"存储他的引用 ...
- java中字符串的非空判断
问题如下:在java 中 字符串为null 如何判断String str;if(str==null) ??str.equal("null") ?? 答:我觉得应该搞清楚字符串对象和 ...
- java中字符串String 转 int(转)
java中字符串String 转 int String -> int s="12345"; int i; 第一种方法:i=Integer.parseInt(s); 第二种方法 ...
- Java:字符串类String的功能介绍
在java中,字符串是一个比较常用的类,因为代码中基本上处理的很多数据都是字符串类型的,因此,掌握字符串类的具体用法显得很重要了. 它的主要功能有如下几种:获取.判断.转换.替换.切割.字串的获取.大 ...
随机推荐
- [hdu5313]二分图性质,dp
题意:给定二分图,求添加的最多边数,使得添加之后还是二分图 思路:如果原图可以分成X,Y两个点集,那么边数最多为|X||Y|条.由于|X|+|Y|==n,所以需要使|X|与|Y|尽量接近.先对原图进行 ...
- SQL SERVER 的窗体函数OVER的使用:row_number/rank/dense_rank
举个例子给大家加深印象,也方便理解: 1.目前有这几笔数据: Select as score into #studentSoure union all Select as score union al ...
- 【SMB源码解析系列】——003.SMB游戏基本框架
前面有了解到RESET中断相关代码,结尾处通过一句jmp进入了无限循环,之后CPU将会在每一帧PUU进入VBlank状态时,接收NMI中断信号, 跳转至NMI代码处继续执行,直到遇见RTI指令时又返回 ...
- Reflux之Action
reflux在flux的基础上,去掉了dispatcher. 在Reflux中,每一个Action本身就是一个Publisher(消息发布者),具有消息发布功能:而每一个Store除了作为数据存储之外 ...
- reids不重启切换rdb到aof
reids不重启切换rdb到aof
- day08文件的操作(0221)
#1.文件操作之追加数据01:f = open("yesterday01",'a+U',encoding="utf-8")#a= append,追加之意,w则为 ...
- Java面试题小结(一)
---恢复内容开始--- 1.用Java解析xml有几种方式,实现场景.区别以及优缺点: 有四种 分别是JDOM.SEX.DOM.JDOM4J 实现场景: JDOM:实现功能简单的地方,例如:解析: ...
- SSE系列内置函数中的shuffle函数
SSE 系列内置函数中的 shuffle 函数 邮箱: quarrying@qq.com 博客: http://www.cnblogs.com/quarryman/ 发布时间: 2017年04月18日 ...
- 【Oracle】CentOS7/CentOS8命令行重启Oracle 11G R2
写在前面 按照读者朋友的要求写了一篇<[Oracle]CentOS7/CentOS8命令行安装Oracle 11G R2>,由于读者完全是按照我的安装方式安装的Oracle数据库,也是将O ...
- Git链接http转ssh
git remote set-url origin git@gitserver:USERNAME/PROJECT.git