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

一、字符串的全排列问题

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. href 和 src 区别

    去网上百度了一下,感觉还是没有清楚的定义,所以自己稍稍的总结了一下: 1 html标签分为行类元素 和块元素 在加空元素(也可以叫做替换元素img input iframe):当元素为替换元素的时候, ...

  2. [图形学] Chp14 GLU曲面裁剪函数程序示例及样条表示遗留问题

    样条表示这章已经看完,最后的GLU曲面裁剪函数,打算按书中的示例实现一下,其中遇到了几个问题. 先介绍一下GLU曲面裁剪函数的使用方法. 1 裁剪函数是成对出现的: gluBeginTrim和gluE ...

  3. VB6之HTTP服务器的实现

    之前用VBS写过一个,效率和支持比较low,这次闲着没事用VB重写了一次. 当前的实现版本仅支持静态文件的访问(*.html之类),支持访问方式为GET,HTTP状态支持200和404. 两个文件,一 ...

  4. 轻量级代码生成器-OnlyCoder 第二篇

    最近利用业余时间将OnlyCoder又重新打造了一番,使其使用起来更简单.更顺手. 相关的帮助文档也已发布了版本. 界面改版,UI采用了DotNetBar2组件. 还是先看下UI效果吧. 由于使用了  ...

  5. spring注解大全

    出自http://www.cnblogs.com/xiaoxi/p/5935009.html 1.@Autowired @Autowired顾名思义,就是自动装配,其作用是为了消除代码Java代码里面 ...

  6. s2-048远程代码执行漏洞

    在Struts 2.3.x 系列的 Showcase 应用中演示Struts2整合Struts 1 的插件中存在一处任意代码执行漏洞.当你的应用使用了Struts2 Struts1的插件时,可能导致不 ...

  7. 元组-tuple功能介绍

    #元组 不可变类型 相当于只读的列表,不可被修改,不可被修改哦 ##创建元组最后加,最后加, 形成良好的习惯 """ tuple() -> empty tuple ...

  8. mysql数据库定时备份

    最近要用到mysql备份,就写了shell脚本用于备份. #!/bin/bash #定义备份的数据库名称 database=*** #定义备份的时间 currTime=$(date +%Y%m%d) ...

  9. YAML文件解析

    YAML是“另一种标记语言”的外语缩写,YAML 是一种比JSON(json多层次{ 与 [ 会被搞晕的)更直观的表现形式,展示上更易查错和关系描述.因为不需要一个专业工具就可以排查正确性.YAML目 ...

  10. maven简介及基础使用

    一.Maven简介 Maven可译为"知识的积累"."专家",主要服务于基于Java平台的项目构建.依赖管理和项目信息管理. 1.Maven-项目构建工具    ...