[剑指Offer]字符串的排列(Java) 您所在的位置:网站首页 java输出字符串的全排列 [剑指Offer]字符串的排列(Java)

[剑指Offer]字符串的排列(Java)

2023-09-17 03:30| 来源: 网络整理| 查看: 265

题目

字符串的排列 -- newcoder 剑指Offer 27

题目描述

输入一个字符串,按字典序打印出该字符串中字符的所有排列。 例如输入字符串abc,则打印出由字符a,b,c 所能排列出来的所有字符串 abc,acb,bac,bca,cab和cba。

 

思路

采用递归方法,逐个交换char数组中的元素

如:将字符串abcdefg分成俩部分,a和bcdefg,然后将a和bcdefg各位不停的交换。bcdefg则继续进行相同的操作。最后进行一下排序。

1、对于无重复值的情况 固定第一个字符,递归取得首位后面的各种字符串组合; 再把第一个字符与后面每一个字符交换,并同样递归获得首位后面的字符串组合; *递归的出口,就是只剩一个字符的时候, 递归的循环过程,就是从每个子串的第二个字符开始依次与第一个字符交换,然后继续处理子串。 2、假如有重复值呢? 由于全排列就是从第一个数字起,每个数分别与它后面的数字交换,我们先尝试加个这样的判断——如果一个数与后面的数字相同那么这两个数就不交换了。 例如abb,第一个数与后面两个数交换得bab,bba。然后abb中第二个数和第三个数相同,就不用交换了。 但是对bab,第二个数和第三个数不 同,则需要交换,得到bba。 由于这里的bba和开始第一个数与第三个数交换的结果相同了,因此这个方法不行。 换种思维,对abb,第一个数a与第二个数b交换得到bab,然后考虑第一个数与第三个数交换,此时由于第三个数等于第二个数,所以第一个数就不再用与第三个数交换了。再考虑bab,它的第二个数与第三个数交换可以解决bba。此时全排列生成完毕!

 

代码 package com.codinginterviews.str; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; /** * 题目: * 字符串的排列 -- newcoder 剑指Offer 27 * * 题目描述: * 输入一个字符串,按字典序打印出该字符串中字符的所有排列。 * 例如输入字符串abc,则打印出由字符a,b,c 所能排列出来的所有字符串 * abc,acb,bac,bca,cab和cba。 * * 输入描述: * 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。 */ public class Permutation { /** * 思路: * * 对于无重复值的情况 * * 固定第一个字符,递归取得首位后面的各种字符串组合; * 再把第一个字符与后面每一个字符交换,并同样递归获得首位后面的字符串组合; *递归的出口,就是只剩一个字符的时候, * 递归的循环过程,就是从每个子串的第二个字符开始依次与第一个字符交换,然后继续处理子串。 * * 假如有重复值呢? * 由于全排列就是从第一个数字起,每个数分别与它后面的数字交换,我们先尝试加个这样的判断——如果一个数与后面的数字相同那么这两个数就不交换了。 * 例如abb,第一个数与后面两个数交换得bab,bba。然后abb中第二个数和第三个数相同,就不用交换了。 * 但是对bab,第二个数和第三个数不 同,则需要交换,得到bba。 * 由于这里的bba和开始第一个数与第三个数交换的结果相同了,因此这个方法不行。 * * 换种思维,对abb,第一个数a与第二个数b交换得到bab,然后考虑第一个数与第三个数交换,此时由于第三个数等于第二个数, * 所以第一个数就不再用与第三个数交换了。再考虑bab,它的第二个数与第三个数交换可以解决bba。此时全排列生成完毕! * */ public ArrayList permutation(String str) { ArrayList ret = new ArrayList(); if (str == null || str.isEmpty()) { return ret; } char[] arr = str.toCharArray(); permutation(arr, 0, ret); Collections.sort(ret); return ret; } private void permutation(char[] arr, int begin, ArrayList cache) { if (begin == arr.length - 1) { cache.add(new String(arr)); return; } int len = arr.length; for (int i=begin; i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有