当前位置:网站首页>字符串全排列问题
字符串全排列问题
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);
}
}
边栏推荐
- SABER 最强大的数模混合信号仿真软件
- ENVI_ Idl: read the NO2 column content of all OMI products and calculate the monthly average, quarterly average, annual average + analysis
- ENVI_IDL:批量重投影Modis Swath产品并指定范围输出为Geotiff格式+解析
- Problems encountered in yolov3 training its own data set
- ENVI_IDL:批量重投影ModisSwath产品(调用二次开发接口)+解析
- LeetCode:动态规划中的0-1背包问题【快来直接套模板啦】
- 03 design of urban road dedusting and cooling system based on ZigBee
- 04基于ZigBee的室内无线定位系统设计
- VS Code 问题:launch:program‘...\.vscode\launch.exe‘ dose not exist
- Labelme 的简单用法和界面介绍
猜你喜欢

windows安装mysql和jdbc

笔记一之IDL基础内容:常用数据类型_创建数组_类型转换_print输出_基本运算_关系运算

Integrated learning

04 design of indoor wireless positioning system based on ZigBee

VGG (Visual Geometry Group)

04基于ZigBee的室内无线定位系统设计

ENVI_IDL:批量拼接Modis Swath的逐日数据并输出为Geotiff格式

Hands on deep learning -- from full connection layer to convolution layer

gdb+vscode进行调试4——gdb执行相关命令

工程编译那点事:Makefile和cmake(一)
随机推荐
Zeno paradox 2 Achilles and tortoise
Oozie 集成 Shell
禁止自作聪明的Safari打开网页时自动播放
电解电容特性及应用要点
【萌新解题】三数之和
Leveraging Semi-Supervised Learning for Fairness using Neural Networks
windows安装mysql和jdbc
ENVI_IDL:批量重投影ModisSwath产品(调用二次开发接口)+解析
On the properties and methods of list < t >
Saber's most powerful digital analog mixed signal simulation software
HRNet
Opengauss Developer Day 2022 dongfangtong sincerely invites you to visit the "dongfangtong ecological tools sub forum"
性能强悍的图表组件库 ScottPlot
06 design of smart electronic medicine box based on stm32
关于1000BASE-T1 1000BASE-TX和100BASE-T1
ENVI_ Idl: batch Reproject MODIS swath products and specify the range output as GeoTIFF format + parsing
芝诺悖论2 阿基里斯与乌龟
JS practical tips
06基于STM32的智能电子药盒设计
Basic principle and parameter interpretation of operational amplifier