算法笔记_025:字符串的全排列(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
算法笔记_025:字符串的全排列(Java)的更多相关文章
- 算法笔记_134:字符串编辑距离(Java)
目录 1 问题描述 2 解决方案 1 问题描述 给定一个源串和目标串,能够进行如下操作: 在任意位置上插入一个字符: 替换掉任意字符: 删除任意字符. 写一个程序,实现返回最小操作次数,使得对源串 ...
- 算法笔记_023:拓扑排序(Java)
目录 1 问题描述 2 解决方案 2.1 基于减治法实现 2.2 基于深度优先查找实现 1 问题描述 给定一个有向图,求取此图的拓扑排序序列. 那么,何为拓扑排序? 定义:将有向图中的顶点以线性方式进 ...
- 算法笔记_028:字符串转换成整数(Java)
1 问题描述 输入一个由数字组成的字符串,请把它转换成整数并输出.例如,输入字符串“123”,输出整数123. 请写出一个函数实现该功能,不能使用库函数. 2 解决方案 解答本问题的基本思路:从左至右 ...
- 算法笔记_024:字符串的包含(Java)
目录 1 问题描述 2 解决方案 2.1 蛮力轮询法 2.2 素数相乘法 2.3 位运算法 1 问题描述 给定一长字符串A和一短字符串B.请问,如何最快地判断出短字符串B中的所有字符是否都在长字符串A ...
- 算法笔记_022:字符串的旋转(Java)
目录 1 问题描述 2 解决方案 2.1 蛮力移位 2.2 三步反转 1 问题描述 给定一个字符串,要求将字符串前面的若干个字符移到字符串的尾部.例如,将字符串“abcdef”的前3个字符‘a’.‘b ...
- 算法笔记_228:信用卡号校验(Java)
目录 1 问题描述 2 解决方案 1 问题描述 当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,因为并不是一个随便的信用卡号码都是合法的,它必须通过Luhn算法来验证 ...
- 算法笔记_225:数字密码发生器(Java)
目录 1 问题描述 2 解决方案 1 问题描述 在对银行账户等重要权限设置密码的时候,我们常常遇到这样的烦恼:如果为了好记用生日吧,容易被破解,不安全:如果设置不好记的密码,又担心自己也会忘记:如 ...
- 算法笔记_138:稳定婚姻问题(Java)
目录 1 问题描述 2 解决方案 1 问题描述 何为稳定婚姻问题? 有一个男士的集合Y = {m1,m2,m3...,mn}和一个女士的计划X = {n1,n2,n3,...,nn}.每一个男士有 ...
- 算法笔记_137:二分图的最大匹配(Java)
目录 1 问题描述 2 解决方案 1 问题描述 何为二分图的最大匹配问题? 引用自百度百科: 首先得说明一下何为匹配: 给定一个二分图G,在G的一个子图M中,M的边集{E}中的任意两条边都不依附于 ...
随机推荐
- JavaScript实现表单验证
表单验证可以通过 JavaScript 来完成 以下示例代码用于判断表单字段(Name)值是否存在,如果存在,则弹出信息,否则阻止表单提交: <!DOCTYPE html> <htm ...
- ssh连接linux服务器不断开- "Write failed: Broken pipe"
我自己用阿里云的服务器的时候,发现ssh连上以后,一会不用就断掉了,非常不方便,服务端的系统是ubuntu. 查了些东西,原来可以去配置服务端的sshd,或者客户端的ssh,就行了. 1,配置服务器端 ...
- nw.js node-webkit系列(15)如何使用内部模块和第三方模块进行开发
原文链接:http://blog.csdn.net/zeping891103/article/details/50786259 原谅原版链接:https://github.com/nwjs/nw.js ...
- 20145317彭垚 MSF基础应用
20145317彭垚 MSF基础应用 基础问题回答 用自己的话解释什么是exploit,payload,encode? exploit就相当于是载具,将真正要负责攻击的代码传送到靶机中,我觉得老师上课 ...
- [c/c++]指针(3)
在指针2中提到了怎么用指针申配内存,但是,指针申配的内存不会无缘无故地 被收回.很多poj上的题都是有多组数据,每次地数组大小会不同,所以要重新申请 一块内存.但是原来的内存却不会被收回,也是说2.3 ...
- Python3基础 raise 产生RuntimeError 异常
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- <offer4> 04_FindInPartiallySortedMatrix
#include<cstdio> bool Find(int* matrix, int rows, int columns, int number) { bool result = fal ...
- 强大的Manage
Queue和Pipe实现的数据共享方式只支持两种结构 Value 和 Array.Python中提供了强大的Manage专门用来做数据共享,其支持的类型非常多,包括: Value,Array,list ...
- 微信小程序获取用户手机号
获取微信用户绑定的手机号,需先调用wx.login接口. 小程序获取code. 后台得到session_key,openid. 组件触发getPhoneNumber 因为需要用户主动触发才能发起获取手 ...
- python数据持久存储-pickle模块
pickle模块实现了基本的数据序列和反序列化.pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,通过pickle模块的反序列化操作,能够从文件中创建上一次程序保存的对象. 接 ...