【算法与数据结构】Java实现字符串的全排列及组合
注:本文记录了代码编写及调试过程,想直接浏览正确答案的请移步文章结尾。
一、字符串的全排列问题
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实现字符串的全排列及组合的更多相关文章
- Java实现字符串的全排列
1 问题描述 输入一个字符串,打印出该字符串的所有排列.例如,输入字符串"abc",则输出有字符'a','b','c'所能排列出来的所有字符串"abc",&qu ...
- 数据结构与算法--Boyer-Moore和Rabin-Karp子字符串查找
数据结构与算法--Boyer-Moore和Rabin-Karp子字符串查找 Boyer-Moore字符串查找算法 注意,<算法4>上将这个版本的实现称为Broyer-Moore算法,我看了 ...
- AJPFX关于学习java遇到的问题:对算法和数据结构不熟悉
为什么我先拿“数据结构和算法”说事捏?这玩意是写程序最最基本的东东.不管你使用 Java 还是其它的什么语言,都离不开它.而且这玩意是跨语言的,学好之后不管在哪门语言中都能用得上. 既然“数据结构和算 ...
- PTA数据结构与算法题目集(中文) 7-43字符串关键字的散列映射 (25 分)
PTA数据结构与算法题目集(中文) 7-43字符串关键字的散列映射 (25 分) 7-43 字符串关键字的散列映射 (25 分) 给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义 ...
- Java实现蓝桥杯VIP算法训练 奇变的字符串
试题 算法训练 奇变的字符串 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 将一个字符串的奇数位(首位为第0位)取出,将其顺序弄反,再放回原字符串的原位置上. 如字符串" ...
- 数据结构Java实现03----栈:顺序栈和链式堆栈
一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...
- 经典算法问题的java实现 (二)
原文地址: http://liuqing-2010-07.iteye.com/blog/1403190 1.数值转换(System Conversion) 1.1 r进制数 数N的r进制可以表 ...
- 常见算法合集[java源码+持续更新中...]
一.引子 本文搜集从各种资源上搜集高频面试算法,慢慢填充...每个算法都亲测可运行,原理有注释.Talk is cheap,show me the code! 走你~ 二.常见算法 2.1 判断单向链 ...
- 八大排序算法总结与java实现(转)
八大排序算法总结与Java实现 原文链接: 八大排序算法总结与java实现 - iTimeTraveler 概述 直接插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 ...
随机推荐
- English - Titanium Bike
The silver-gold triathlon bike was sitting in Kris's dining room next to the door. It had no kicksta ...
- Go学习笔记(一)Let's 干吧
加 Golang学习 QQ群共同学习进步成家立业 ^-^ 群号:96933959 简介 Go是Google开发的一种 静态强类型.编译型,并发型,并具有垃圾回收功能的编程语言.为了方便搜索和识 ...
- Python爬虫从入门到放弃(十五)之 Scrapy框架中Spiders用法
Spider类定义了如何爬去某个网站,包括爬取的动作以及如何从网页内容中提取结构化的数据,总的来说spider就是定义爬取的动作以及分析某个网页 工作流程分析 以初始的URL初始化Request,并设 ...
- 微信小程序+OLAMI(欧拉蜜)自然语言API接口制作智能查询工具--快递、聊天、日历等
微信小程序最近比较热门,再加上自然语义理解也越来越被人关注,于是我想赶赶潮流,做一个小程序试试.想来想去快递查询应该是一种比较普遍的需求. 如果你也在通过自然语言接口做点什么,希望我的这篇博客能帮到你 ...
- 编写高质量代码改善C#程序的157个建议:第17个建议之多数情况下使用foreach进行循环遍历
今天是我看<编写高质量代码:改善C#程序的157个建议>第二遍的时候了,看完这本书的确是受益匪浅,学到了很多东西,也明白了很多道理. 里面的代码我每个都调试了一遍,有时候是有些出入的,可能 ...
- ssh连接异常:read from socket failed connection reset by peer
我出现这个问题的原因是:之前将/etc的权限设为777, 这是一个错误的操作!!然后我把权限修改过来(chmod 400 /etc) 重启服务(/bin/systemctl restart ssh.s ...
- vue怎么样创建组件呢??
我知道vue中核心就是组件,但是组件是什么呢?组件有什么用呢?怎么用组件呢?怎么样创建自己的组件呢? 前面两个问题就不说了,这里来说说,后面的两个问题: 1)创建自己的组件 通过vue.extend( ...
- (转)生产者/消费者问题的多种Java实现方式 (待整理)
实质上,很多后台服务程序并发控制的基本原理都可以归纳为生产者/消费者模式,而这是恰恰是在本科操作系统课堂上老师反复讲解,而我们却视而不见不以为然的.在博文<一种面向作业流(工作流)的轻量级可复用 ...
- Spring源码情操陶冶-ContextLoader
前言-阅读源码有利于陶冶情操,本文承接前文Spring源码情操陶冶-ContextLoaderListener 静态代码块内容 ContextLoader在被主动调用的时候,会执行其的一个静态块,代码 ...
- 【javascript】ajax的参数
1. 常用参数 url type: contentType: dataType: data: success: error 2. 特殊参数 context: 这个对象用于设置Ajax相关回调函数的上下 ...