当前位置:网站首页>字符串全排列问题
字符串全排列问题
2022-07-17 00:13:00 【想做程序媛的小太阳】
问题描述:
输入一个字符串,打印出该字符串的所有排列。例如,输入字符串”abc”,则输出有字符’a’,’b’,’c’所能排列出来的所有字符串”abc”,”acb”,”bac”,”bca”,”cab”,”cba”。
递归实现:
从字符串中选出一个字符作为排列的第一个字符,然后对剩余的字符进行全排列。如此递归处理,从而得到所有字符的全排列。具体代码如下:
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);
}
}
字典序排列实现
(1)找到排列中最后(最右)一个升序的首位位置i。
(2)找到排列中第i位右边最后一个比ai大的位置j。
(3)交换ai和aj的值。
(4)把第i+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);
}
}
边栏推荐
- 关于1000BASE-T1 1000BASE-TX和100BASE-T1
- Differences between saber PSPICE Simulink power supply simulation software
- 05基于ZigBee的路灯灯控故障检测系统设计
- ENVI_ Idl: read the NO2 column content of all OMI products and calculate the monthly average, quarterly average, annual average + analysis
- iFair: Learning Individually Fair Data Representations for Algorithmic Decision Making
- [cute new problem solving] sum of three numbers
- 基于蒙特卡洛的强化学习方法【附带代码实现】
- Zeno paradox 2 Achilles and tortoise
- Handling conditional discrimination
- DGC best practice: how to ensure that confidential data is not leaked when entering the lake?
猜你喜欢

iFair: Learning Individually Fair Data Representations for Algorithmic Decision Making

运算放大器基本原理与参数解读

02基于ZigBee的智能家居系统设计

ResNet

(附word操作以及视频讲解)使用ARCGIS进行地图配准_投影变换_普通地图制作_专题地图制作

MATLAB :Warning: the font “Times” is not available

Powerful chart component library scottplot

CAN协议通信

Dueling DQN的理论基础及其代码实现【Pytorch + Pendulum-v0】

gdb+vscode进行调试5——gdb查看相关命令
随机推荐
成信大ENVI_IDL第二周课堂内容:打开HDF4文件并读取文件以及简单的数据处理和保存+详细解析
gdb+vscode进行调试8——使用core分析死循环、死锁、段错误
Hands on deep learning -- from full connection layer to convolution layer
ENVI_IDL:读取所有OMI产品的NO2柱含量并计算月均值、季均值、年均值+解析
散列表、布隆过滤器、分布式一致性hash
Allegro design entry CIS and OrCAD capture CIS relationship
YYDS!阿里技术官最新总结的分布式核心技术笔记已上线,堪称福音
06基于STM32的智能电子药盒设计
浏览器无法打开Tensorboard
搭建Sqoop环境
[cute new problem solving] sum of three numbers
GoogLeNet
Allegro Design Entry CIS 和 Orcad Capture CIS 关系
SAE J1708/J1587 协议详解
Build spark on yarn environment
02基于ZigBee的智能家居系统设计
gdb+vscode进行调试2——gdb断点相关
Prohibit smart Safari from playing automatically when opening a web page
JS tree view array batch circular operation
指針常量與常量指針愛恨情仇