[剑指offer] 字符串的顺序全排列

题目描述

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

输入描述

输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

输出描述

顺序输出字符串的所有排列

题目分析

  这是一个字符串全排列的问题,把全部序列存在TreeSet中默认可得到字典顺序。

TreeSet

    基于TreeMap实现的SortedSet,可以对Set集合中的元素进行排序,排序后按升序排列元素(缺省是按照自然排序),非线程安全。

思路:

  固定一个字符串之后,之后再将问题变小,只需求出后面子串的排列个数就可以得出结果,然后依次将后面的字符串与前面的交换,再递归子串的排列结果,最后当所有字符都固定结束递归。

下面这张图很清楚的给出了递归的过程:

 

解法 运行时间:131ms 占用内存:1477k 

import java.util.*;
public class Solution {
    //用于最后返回结果
    ArrayList<String> list  = new ArrayList<>();
    //遍历的时候来存储序列实现排序
    TreeSet<String> set = new TreeSet<>();

    public ArrayList<String> Permutation(String str) {
       if(str==null || str.length()==0) return list;

       Permutation(str.toCharArray(),0);
       //容器转换
       list.addAll(set);
       return list;
    }
    public void Permutation(char[] s,int index){
        if(s==null ||s.length==0 || index<0 || index>s.length-1)  return ;
        if(index==s.length-1){//递归固定到最后一个位置,把该串加入集合
            set.add(new String(s));
        }else{//固定前index+1个字符,递归后面所有可能的子串
           for(int i = index;i<s.length;i++){
               swap(s,index,i);//交换一次形成一个子串
               Permutation(s,index+1);
               swap(s,i,index);//复原使下次循环产生下一个子串
           }
        }
    }
    public void swap(char[] s,int i,int j){
        char temp = s[i];
        s[i] = s[j];
        s[j] = temp;
    }
}
时间: 2024-10-10 12:37:56

[剑指offer] 字符串的顺序全排列的相关文章

剑指Offer——反转单词顺序(Java)

问题描述:输入一个英文句子,反转句子中的单词的顺序,但单词内字符的顺序不变:(为简单起见,标点符号与普通字符当做一样处理) 示例       :输入:"I am a student." 输出: ".student a am I" 策略      :策略是先反转整个字符串,在根据空格划分单词,然后依次反转每个单词 代码      : public class ReverseString { /*****反转单个字符串函数****/ public char[] reve

剑指offer——调整数组顺序使奇数位于偶数前面

题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 看代码: public class Solution { public static void reOrderArray(int[] arr) { int i,j,target; for (i = 1 ; i< arr.length; i++) { target = arr[i]; if (target%2!=0)

剑指offer—字符串转换整数

对于这个问题, 本题考查的实际上就是字符串转换成整数的问题,或者说是要你自行实现atoi函数.那如何实现把表示整数的字符串正确地转换成整数呢?以"345"作为例子: 当我们扫描到字符串的第一个字符'3'时,由于我们知道这是第一位,所以得到数字3. 当扫描到第二个数字'4'时,而之前我们知道前面有一个3,所以便在后面加上一个数字4,那前面的3相当于30,因此得到数字:3*10+4=34. 继续扫描到字符'5','5'的前面已经有了34,由于前面的34相当于340,加上后面扫描到的5,最终

【剑指offer】字符串的排列

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26390551 题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入: 每个测试案例包括1行. 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母. 输出: 对应每组数据,按字典序输出所有排列. 样例输入: abc BCA 样例输出:

【剑指offer】翻转单词顺序

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27372033 题目描写叙述: JOBDU近期来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看.但却读不懂它的意思.比如,"student. a am I".后来才意识到.这家伙原来把句子单词的顺序翻转了,正确的句子应该是"I am a student.". Cat对一一

剑指offer (49) 字符串转数字

class Test { public: Test() : n2(0), n1(n2 + 2) { } private: int n1; int n2; }; 调用构造函数之后,n1个n2各为多少? 分析:构造函数的初始化顺序仅仅取决于成员变量的声明顺序,所以这是 应该是 n1先初始化,然后是n2初始化 当n1初始化值 = n2值 + 2,此时n2并没有初始化,n2为内置类型并且是non-static,所以n2此时为随机值 故 n1 为随机值,n1初始完之后,n2初始化为0 最终 n1为随机值,

剑指offer(27)字符串的排列

题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母. 题目分析 这题还算可以,关于全排列,有两种解法,第一种就是递归全排列法,第二种就是回溯法. 递归全排列法: 就是剑指offer上的做法,也比较容易理解,不过挺少人答的也就是 把字符串分为两部分:第一部分为第一个字符,第二部分为第一个

【Java】 剑指offer(58-1) 翻转单词顺序

  本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字母一样处理.例如输入字符串"I am a student. ",则输出"student. a am I". 思路 一开始自己觉得要用split()方法,但这要开辟新的数组,占内存空间,不行. 首先实现翻转整个句子:只需要在首尾两端各放置一个

剑指OFFER之调整数组顺序使奇数位于偶数前面找(九度OJ1516)

题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 输入: 每个输入文件包含一组测试案例.对于每个测试案例,第一行输入一个n,代表该数组中数字的个数.接下来的一行输入n个整数.代表数组中的n个数. 输出: 对应每个测试案例,输入一行n个数字,代表调整后的数组.注意,数字和数字之间用一个空格隔开,最后一个数字后面没有空格. 样例输入: 5 1 2 3 4 5 样例输