注:本文记录了代码编写及调试过程,想直接浏览正确答案的请移步文章结尾。

一、字符串的全排列问题

1. 下面是最初的代码(答案有错误-重复输出)

 import java.util.Scanner;

 public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String str = sc.nextLine();
char[] ch = str.toCharArray();
//print(ch);
permutation(ch);
}
}
public static void permutation(char[] ch) {
if (ch == null || ch.length < 1) {
return;
}else {
permutation(ch, 0);
}
}
public static void permutation(char[] ch, int begin) {
char tmp ;
if (begin == ch.length - 1) {
print(ch);
System.out.println();
return;
}else {
for (int i = 0; i < ch.length; i++) {
tmp = ch[begin];
ch[begin] = ch[i];
ch[i] = tmp;
permutation(ch, begin + 1);
tmp = ch[begin];
ch[begin] = ch[i];
ch[i] = tmp;
}
}
}
public static void print(char[] ch) {
for (int i = 0; i < ch.length; i++) {
System.out.print(ch[i]);
}
}
}

思想: 固定、交换、递归。

举例:输入abc,第一次先固定第一个字符a,使用递归交换a后面的字符(这里递归指的是a后面的字符串也是先固定第一个字符,之后再交换其后的字符)。

错误:输入abc,输出结果bac abc acb abc bac bca bca cba cab

2. debug过程

看到输出答案中有重复,猜想可能是字符交换的循环写的有问题,找到循环,第一眼就看到一个错误,for循环的迭代变量i初始值设置为0,这样达不到“固定”的效果,改之。输出正确。

结果

输入:abc

输出:abc acb bac bca cba cab

3.正确代码

 import java.util.Scanner;

 public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String str = sc.nextLine();
char[] ch = str.toCharArray();
permutation(ch);
}
}
public static void permutation(char[] ch) {
if (ch == null || ch.length < 1) {
return;
}else {
permutation(ch, 0);
}
}
public static void permutation(char[] ch, int begin) {
char tmp ;
if (begin == ch.length - 1) {
print(ch);
System.out.print(" ");
return;
}else {
for (int i = begin; i < ch.length; i++) {
tmp = ch[begin];
ch[begin] = ch[i];
ch[i] = tmp;
permutation(ch, begin + 1);
tmp = ch[begin];
ch[begin] = ch[i];
ch[i] = tmp;
}
}
}
public static void print(char[] ch) {
for (int i = 0; i < ch.length; i++) {
System.out.print(ch[i]);
}
}
}

二、字符串的组合问题

思想:分成两部分,(1)要打印的字符在第一部分,则在其后找其他(number-1)个字符。(2)要打印的字符不在第一部分,则在其后找其他(number)个字符

注:(1) 这里用了递归的方法。(2) number表示每次打印共有几个字符。

正确代码

注:程序中使用了stack容器保存结果,大家可以使用其他更加熟悉的容器。

 import java.util.Scanner;
import java.util.Stack; public class Main {
public static void main(String[] agrs) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String str = sc.nextLine();
char[] ch = str.toCharArray();
combine_str(ch);
}
}
public static void combine_str(char[] ch) {
if (ch == null || ch.length < 1) {
return;
}
Stack<Character> stack = new Stack<Character>();
for (int i = 1; i <= ch.length; i++) {
combine_str(ch, 0, i, stack);
}
}
public static void combine_str(char[] ch, int begin, int number, Stack<Character> stack) {
if (number == 0) {
System.out.print(stack.toString() + " ");
return;
}
if (begin == ch.length ) {
return;
}
stack.push(ch[begin]);
combine_str(ch, begin + 1, number - 1, stack);
stack.pop();
combine_str(ch, begin + 1, number, stack);
}
}

结果

输入: abc

输出: [a] [b] [c] [a, b] [a, c] [b, c] [a, b, c]

【算法与数据结构】Java实现字符串的全排列及组合的更多相关文章

  1. Java实现字符串的全排列

    1 问题描述 输入一个字符串,打印出该字符串的所有排列.例如,输入字符串"abc",则输出有字符'a','b','c'所能排列出来的所有字符串"abc",&qu ...

  2. 数据结构与算法--Boyer-Moore和Rabin-Karp子字符串查找

    数据结构与算法--Boyer-Moore和Rabin-Karp子字符串查找 Boyer-Moore字符串查找算法 注意,<算法4>上将这个版本的实现称为Broyer-Moore算法,我看了 ...

  3. AJPFX关于学习java遇到的问题:对算法和数据结构不熟悉

    为什么我先拿“数据结构和算法”说事捏?这玩意是写程序最最基本的东东.不管你使用 Java 还是其它的什么语言,都离不开它.而且这玩意是跨语言的,学好之后不管在哪门语言中都能用得上. 既然“数据结构和算 ...

  4. PTA数据结构与算法题目集(中文) 7-43字符串关键字的散列映射 (25 分)

    PTA数据结构与算法题目集(中文)  7-43字符串关键字的散列映射 (25 分) 7-43 字符串关键字的散列映射 (25 分)   给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义 ...

  5. Java实现蓝桥杯VIP算法训练 奇变的字符串

    试题 算法训练 奇变的字符串 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 将一个字符串的奇数位(首位为第0位)取出,将其顺序弄反,再放回原字符串的原位置上. 如字符串" ...

  6. 数据结构Java实现03----栈:顺序栈和链式堆栈

    一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...

  7. 经典算法问题的java实现 (二)

    原文地址: http://liuqing-2010-07.iteye.com/blog/1403190   1.数值转换(System Conversion) 1.1 r进制数   数N的r进制可以表 ...

  8. 常见算法合集[java源码+持续更新中...]

    一.引子 本文搜集从各种资源上搜集高频面试算法,慢慢填充...每个算法都亲测可运行,原理有注释.Talk is cheap,show me the code! 走你~ 二.常见算法 2.1 判断单向链 ...

  9. 八大排序算法总结与java实现(转)

    八大排序算法总结与Java实现 原文链接: 八大排序算法总结与java实现 - iTimeTraveler 概述 直接插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 ...

随机推荐

  1. Bootstrap模态弹出框

    前面的话 在 Bootstrap 框架中把模态弹出框统一称为 Modal.这种弹出框效果在大多数 Web 网站的交互中都可见.比如点击一个按钮弹出一个框,弹出的框可能是一段文件描述,也可能带有按钮操作 ...

  2. rownumber和rowid伪劣用法

    select rownum ,deptno,dname loc from  dept; select deptno,dname,loc from dept where rownum=1; select ...

  3. Watson Explorer Analytical Components 3 - use case scenarios

    The followings are the user case scenarios that WEX can be used for generating value. 1.Customer Ins ...

  4. Samba远程代码执行漏洞(CVE-2017-7494)本地复现

    一.复现环境搭建 搭建Debian和kali两个虚拟机: 攻击机:kali (192.168.217.162): 靶机:debian (192.168.217.150). 二.Debian安装并配置s ...

  5. jsp注册页面的省份联动(网上copy别人的,然后自己弄了一下才知道怎么用)

    首先写一个js里面是所有的省份一些七七八八的东西,直接复制黏贴过去就好了. var addressInit = function(_cmbProvince, _cmbCity, _cmbArea, d ...

  6. oracle 小测

    01)oracle10i,oracle11g,oracle12c,其它i,g,c什么意思? i(Internet)互联网 g(grid)网格 c(cloud) 云02)sqlplus是什么意思? 是o ...

  7. C#装箱拆箱

    .       装箱和拆箱是一个抽象的概念 2.       装箱是将值类型转换为引用类型 :拆箱是将引用类型转换为值类型        利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类 ...

  8. 关于shell脚本函数、数组、字符串截取、svn更新发布实例

    #/bin/bash #功能:QA服根据模板创建区配置文件并提交到svn上. SOURCE_PATH=/data/source_code SVN_PATH=/code/psm   #svn发布目录,要 ...

  9. GitHub 入门教程

    一.前言 编程进阶的道路是坎坷的,没有任何捷径.这个时期只能是积累.吸收.学习.坚持,做到量的积累,到质的飞跃 古语有云:'书山有路,勤为径'.'不积跬步,无以至千里' 编程是一个动手实践性的学科,多 ...

  10. lfcp——PB使用

    场景:记录以备忘. 1 直接说明 pb连接说明:目前项目共有性能.功能.业务.联调四个环境.所以pb可以连接四个不同的数据库.1.copy一份pb程序,修改main.ini文件中的DBCONNECT/ ...