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

一、字符串的全排列问题

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. .net入门 - Get Started with .NET

    阅读原文 有很多种方式去开始使用.net.因为.net是一个巨大的平台,在这个文档里面有很多文章,告诉你如何从不同的角度去开始使用.net. 使用.NET的语言入门 C#入门文章和C#教程提供了以C# ...

  2. mybatis和spring整合

    参考文档: http://www.cnblogs.com/jyh317/p/3834142.html http://www.cnblogs.com/xdp-gacl/p/4271627.html ht ...

  3. JFile的导入xlsx与xls

    首先需要有JAVA的一些jar包 下载地址:http://download.csdn.net/detail/qq_35980546/9892511 你要先配置好路由,还有能拿到绝对路径才行 下面直接给 ...

  4. Unity-Shader-镜面高光Phong&BlinnPhong-油腻的师姐在哪里

    [旧博客转移 - 2016年4月4日 13:13 ] 油腻的师姐: 以前玩过一款很火热的端游<剑灵>,剑灵刚出来的时候,某网页游戏广告视频中有句台词:"我不断的在寻找,有你的世界 ...

  5. 理解Linux文件系统之inode

    很少转发别人的文章,但是这篇写的太好了. 理解inode   作者: 阮一峰 inode是一个重要概念,是理解Unix/Linux文件系统和硬盘储存的基础. 我觉得,理解inode,不仅有助于提高系统 ...

  6. 关于table表格td里内容是数字而且太长不换行的问题

    <p>table{table-layout:fixed}</p><p>table td{word-wrap:break-word}</p><p&g ...

  7. java多态加深

    当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法. public class Dtai ...

  8. C# 创建、部署和调用WebService的简单示例

    废话不多说,下面开始创建一个简单的webservice的例子.这里我用的是Visual Studio 2015开发工具. 首先创建一个空的Web应用程序. 然后鼠标右键点击项目,选择 添加>新建 ...

  9. NLP —— 图模型(二)条件随机场(Conditional random field,CRF)

    本文简单整理了以下内容: (一)马尔可夫随机场(Markov random field,无向图模型)简单回顾 (二)条件随机场(Conditional random field,CRF) 这篇写的非常 ...

  10. [COGS 2051] 王者之剑

    Saber大法吼 2051. 王者之剑 ★★★☆   输入文件:Excalibur.in   输出文件:Excalibur.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述 ...