zoukankan      html  css  js  c++  java
  • P154、面试题28:字符串的排列

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

    测试用例:
    1)功能测试(输入的字符串中有1个或者多个字符);
    2)特殊输入测试(输入的字符串的内容为空或者是null指针);
     
     
    相关题目:
    1)如果不是求字符的所有排列,而是求字符的所有组合,该怎么办。还是输入三个字符a、b、c,则它们的组合有a、b、c、ab、ac、bc、abc。当交换字符串中的两个字符时,虽然能得到两个不同的排列,但却是同一个组合。比如ab和ba是不同的排列,但只算一个组合。
    2)输入一个含有8个数字的数组,判断有没有可能把这8个数字分别放到正方体的8个顶点上,使得正方体上三组相对的面上的4个顶点的和都相等。
    3)在8*8的国际象棋上摆放8个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行、同一列或者同一对角线上。
     
    思路:还是万年不变的递归!!!需要通过Debug来了解递归思想了。
     
     
    代码实现:
    package com.yyq;
    import java.util.Arrays;
    /**
     * Created by Administrator on 2015/9/20.
     */
    public class StringPermutation {
        public static void permutation_1(char[] pStr){
            if (pStr == null || pStr.length == 0)
                return;
            permutation_2(pStr, 0,pStr.length-1);
        }
        public static void permutation_2(char[] buf, int start, int end) {
            if (start == end) {// 当只要求对数组中一个字母进行全排列时,只要就按该数组输出即可
                for (int i = 0; i <= end; i++) {
                    System.out.print(buf[i]);
                }
                System.out.println();
            } else {// 多个字母全排列
                for (int i = start; i <= end; i++) {
                    char temp = buf[start];// 交换数组第一个元素与后续的元素
                    buf[start] = buf[i];
                    buf[i] = temp;
                    permutation_2(buf, start + 1, end);// 后续元素递归全排列
                    temp = buf[start];// 将交换后的数组还原
                    buf[start] = buf[i];
                    buf[i] = temp;
                }
            }
        }
        // ====================测试代码====================
        public static void Test(char[] pStr)
        {
            if(pStr == null)
                System.out.println("Test for NULL begins:");
            else
                System.out.println("Test for " + Arrays.toString(pStr) + " begins:");
            permutation_1(pStr);
            System.out.println();
        }
        public static void main(String[] args){
            Test(null);
            String string01 = "";
            char string1[] = string01.toCharArray();
            Test(string1);
            String string02 = "a";
            char string2[] = string02.toCharArray();
            Test(string2);
            String string03 = "ab";
            char string3[] = string03.toCharArray();
            Test(string3);
            String string04 = "abc";
            char string4[] = string04.toCharArray();
            Test(string4);
        }
    }
    结果输出:
    Test for NULL begins:
     
    Test for [] begins:
     
    Test for [a] begins:
    a
     
    Test for [a, b] begins:
    ab
    ba
     
    Test for [a, b, c] begins:
    abc
    acb
    bac
    bca
    cba
    cab
     
     
     
     
  • 相关阅读:
    cp
    usr/sbin/inetd
    mysql
    Iptables的规则语法
    CentOS系统安装过程中配置软RAID-0或RAID-1
    25道shell面试题
    虚拟机
    进入单用户模式
    正则表达式
    js操作div的显隐
  • 原文地址:https://www.cnblogs.com/yangyquin/p/4954172.html
Copyright © 2011-2022 走看看