剑指offerDay30----字符串的排列

题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

思路:

方法一:固定第一个字符,然后依次将后面的字符串与前面的交换,那么排列的个数就是除了第一个字符以外,其他字符的排列个数+1。也就是固定一个字符串之后,之后再将问题变小,只需求出后面子串的排列个数就可以得出结果。

方法二:

源码:GitHub源码

方法一:

import java.util.*;
public class Solution {
    ArrayList<String> list = new ArrayList<String>();
    public ArrayList<String> Permutation(String str){
        if(str!=null && str.length()>0){
            Permutation(str.toCharArray(),0);
            Collections.sort(list);
        }
        return list;
    }

    private void Permutation(char[] s,int start){
        if(start == s.length-1){
            if(!list.contains(new String(s)))//将重复的元素删去
            list.add(new String(s));
        }else{
            for(int i = start;i < s.length;++i){
                    swap(s,start,i);
                    Permutation(s,start + 1);
                    swap(s,start,i);
            }
        }
    }

    private void swap(char[] s,int i,int j){
        char tmp = s[i];
        s[i] = s[j];
        s[j] = tmp;
    }
}

方法二:

import java.util.*;
public class Solution {
    ArrayList<String> list = new ArrayList<String>();
    public ArrayList<String> Permutation(String str){
        if(str == null || str.length() == 0){
            return list;
        }
        char[] s = str.toCharArray();
        Arrays.sort(s);
        list.add(new String(s));
        int len = s.length;
        while(true){
            int left = len - 1;
            int right;
            while(left >= 1 && s[left - 1] >= s[left]){
                --left;
            }
            if(left == 0)
                break;
            right = left;
            while(right < len && s[right] > s[left - 1]){
                right++;
            }
            swap(s,left - 1,right - 1);
            reverse(s,left);
 
            list.add(new String(s));
        }
 
        return list;
    }

    private void reverse(char[] s,int k){
        if(s == null || s.length <= k)
            return;
        int len = s.length;
        for(int i = 0;i<((len - k) >> 1);++i){
            int m = k + i;
            int n = len - 1 - i;
            if(m<=n){
                swap(s,m,n);
            }
        }
    }

     private void swap(char[] s,int i,int j){
        char tmp = s[i];
        s[i] = s[j];
        s[j] = tmp;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 字符串的全排列 题目描述: 输入一个字符串,打印出该字符串中字符的所有排列。 例如输入字符串abc,则输出由字符a...
    MinoyJet阅读 11,412评论 4 11
  • 问题 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排...
    黎贝卡beka阅读 497评论 0 1
  • 1. 定义 排列:从给定个数的元素中取出指定个数的元素进行排序组合:从给定个数的元素中取出指定个数的元素,不考虑排...
    dreamsfuture阅读 9,066评论 2 3
  • 写在前面: 最近遇到了一道题涉及全排列的。记得之前在《剑指offer》上遇到了一道类似的题。因此今早把这道题翻了出...
    BlueSkyBlue阅读 677评论 0 0
  • 下面是我整理的,剑指Offer前五章所有的题目以及相关题和拓展题的题目和答案。代码的话放在github上,您可以下...
    kikido阅读 1,105评论 0 1

友情链接更多精彩内容