字符串全排序,非重复的全排序

题目:求一个字符串的全排列。

思路:我们可以生成一个解答树:拿字符串“bca”来说,此时如果我们处理到第cur个位置,那么我们可以和从当前这个位置开始依次和之后的位置互换字符,这样就能确保二叉树每一层(当前位置)的结果都能出现过了,然后接着递归下去。

package org;

import java.util.Arrays;

public class SortMethod {
    public static void create(char a[], int cur, int n) {
        if (cur == n) {
            System.out.println(Arrays.toString(a));
            return;
        }

        for (int i = cur; i < n; i++) {
            char tmp = a[cur];
            a[cur] = a[i];
            a[i] = tmp;
            create(a, cur+1, n);
            tmp = a[cur];
            a[cur] = a[i];
            a[i] = tmp;
        }
    }

    public static void main(String[] args) {
        String a = "bba";
        create(a.toCharArray(), 0, a.length());
    }
}

题目:生成一个没有重复的全排列。

思路:和前面的有一些差别,首先我们要先明白如果能确保没有重复的可能出现,我们可以把每个重复出现过的字符依次标上一个下标,那么我只要保证每个生成的全排列的重复字符都能保持最原先的排列,也就是没有逆序,这样我们就能保证没有重复序列的生成了。多加一个for判断。

package org;

import java.util.Arrays;

public class SortMethod {
    public static void create(char a[], int cur, int n) {
        if (cur == n) {
            System.out.println(Arrays.toString(a));
            return;
        }

        for (int i = cur; i < n; i++) {
            char tmp = a[cur];
            a[cur] = a[i];
            a[i] = tmp;
            create(a, cur+1, n);
            tmp = a[cur];
            a[cur] = a[i];
            a[i] = tmp;
        }
    }

    public static void dul(char a[], int cur, int n) {
        if (cur == n) {
            System.out.println(Arrays.toString(a));
            return;
        }

        for (int i = cur; i < n; i++) {
            int vis[] = new int[30];
            for (int j = 0; j < 30; j++) vis[j] = 0;
            for (int j = i-1; j >= cur; j--) vis[a[j]-'a'] = 1;
            if (vis[a[i]-'a'] == 1) continue;

            char tmp = a[cur];
            a[cur] = a[i];
            a[i] = tmp;
            dul(a, cur+1, n);
            tmp = a[cur];
            a[cur] = a[i];
            a[i] = tmp;
        }
    }

    public static void main(String[] args) {
        String a = "bba";
        //create(a.toCharArray(), 0, a.length());
        dul(a.toCharArray(), 0, a.length());
    }
}
时间: 2025-01-10 18:20:15

字符串全排序,非重复的全排序的相关文章

2015年华为校招机试题和代码实现(分解字符串,拼音转数字,去除重复字符并排序,等式变换)

再来一套2015年的华为机试题. 第一题(60分): 按要求分解字符串,输入两个数M,N:M代表输入的M串字符串,N代表输出的每串字符串的位数,不够补0.例如:输入2,8, "abc" ,"123456789",则输出为"abc00000","12345678","90000000" 分析思路: 容易题 1.获得字符串的长度length后,判断与要输出位数N的大小,大于N的话,直接printf前N位字符,然

去除重复字符并排序

运行时间限制:无限制 内容限制: 无限制 输入: 字符串 输出: 去除重复字符并排序的字符串 样例输入: aabcdefff 样例输出: abcdef 思路: 这个题用数组来哈希,时间复杂度为O(n) 1)    初始化一个int数组hash,数组的角标和数组的值正好构成一对<key,value>; 2)    遍历字符串,将每个字符放入数组中对应的位置,出现过得字符,其数组值为1 3)    遍历数组,输出数组中数组值为1所对应的字符 Java解法: import java.util.Sca

混合使用 ForkJoin, Akka, Future 实现一千万个不重复整数的排序

  本来只是想写一个 ForkJoin 的示例,但写着写着就加入了 akka, future 的元素, 是在解决问题的过程中逐渐引入的.我觉得这种学习的方式很好,就是在解决一个问题的过程中,可以综合地探索和学习到很多不同的东西.传统的学习讲究"循序渐进"的方式,但是"跳跃式+快速试错"也许是学习新技术的更好的方法. :) 原本是想实现十亿个不重复整数的排序, 由于文件外排序没有解决,因此,暂时实现的是一千万个不重复数,可以一次性加载到 2G 的内存里.  一. 任务

【数据结构】非比较排序算法(实现计数排序和基数排序)

● 计数排序 1.算法思想: 计数排序是直接定址法的变形.通过开辟一定大小的空间,统计相同数据出现的次数,然后回写到原序列中. 2.步骤: 1)找到序列中的最大和最小数据,确定开辟的空间大小. 2)开辟空间,利用开辟的空间存放各数据的个数. 3)将排好序的序列回写到原序列中. 具体实现如下: void CountSort(int *arr, int size) {  assert(arr);  int min = arr[0];  int max = arr[0];  int num = 0;

非基于比较的排序算法之一:计数排序

计数排序(Counting sort)是一种稳定的排序算法.计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值小于等于i的元素的个数.然后根据数组C来将A中的元素排到正确的位置. 限制:所有值得取值范围不能太大,并且需要知道确切的取值范围.本算法需要的辅助空间要求较高. 当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n + k).计数排序不是比较排序,排序的速度快于任何比较排序算法. 现在给出C#实现的计数排序(counting sort) public vo

字符串非重复全排列算法

[题目描述] 输入一个字符串,打印出该字符串中字符的所有排列. 例如输入字符串abc,则输出由字符a.b.c 所能排列出来的所有字符串 abc.acb.bac.bca.cab 和 cba. [分析] 从集合中依次选出每一个元素,作为排列的第一个元素,然后对剩余的元素进行全排列,如此递归处理,从而得到所有元素的全排列.以对字符串abc进行全排列为例,我们可以这么做:以abc为例 固定a,求后面bc的排列:abc,acb,求好后,a和b交换,得到bac 固定b,求后面ac的排列:bac,bca,求好

黑马程序员——java——对一个字符串中的数值进行从小到大的排序

对一个字符串中的数值进行从小到大的排序 例如: String s = "8 96 88 58 44 52 12 13 39 96 6"; public class SortIntToStringDemo { // 对一个字符串中的数值进行从小到大的排序. public static void main(String[] args) { String s = "8 96 88 58 44 52 12 13 39 96 6"; //调用自定义方法将字符串中的数字进行排序

基于非比較的排序:计数排序(countSort),桶排序(bucketSort),基数排序(radixSort)

计数排序 条件:要排序的数组的元素必须是在一定范围的,比方是1~100.在排序之前我们必须知道数组元素的范围. 思路:顾名思义:就是用一个数组来计数的. 步骤: 1.用一个数组来计数count[ ],将要排序的数组arr[ ]的元素记为数组count[ ]数组的下标,假设数组arr[]中有两个数同样就在count[]++.如count[arr[i]]++. 2. 再一次遍历数组count[ ],将count[i]  +=  count[i-1]+count[i-2]+....+count[0],

排序算法(七)非比较排序:计数排序、基数排序、桶排序

前面讲的是比较排序算法,主要有冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序等. 非比较排序算法:计数排序,基数排序,桶排序.在一定条件下,它们的时间复杂度可以达到O(n). 一,计数排序(Counting Sort) (1)算法简介 计数排序(Counting sort)是一种稳定的排序算法.计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数.然后根据数组C来将A中的元素排到正确的位置.它只能对整数进行排序. (2)算法描述和实现 得到待排序数的范围(在