专栏首页EdisonTalk剑指Offer面试题:26.字符串的排列

剑指Offer面试题:26.字符串的排列

一、题目:字符串的排列

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

二、解题思路

2.1 核心步骤

  我们可以把一个字符串看成由两部分组成:第一部分为它的第一个字符,第二部分是后面的所有字符。在下图中,我们用两种不同的背景颜色区分字符串的两部分。

Step1.把字符串分为两部分,一部分是字符串的第一个字符,另一部分是第一个字符以后的所有字符(有阴影背景的区域)。

Step2.接下来我们求阴影部分的字符串的排列,拿第一个字符和它后面的字符逐个交换。

2.2 代码实现

    public static void Permutation(char[] str)
    {
        if (str == null)
        {
            return;
        }

        Permutation(str, str, 0);
    }

    public static void Permutation(char[] str, char[] begin, int startIndex)
    {
        if (startIndex == str.Length)
        {
            Console.WriteLine(str);
        }
        else
        {
            for (int i = startIndex; i < str.Length; i++)
            {
                char temp = begin[i];
                begin[i] = begin[startIndex];
                begin[startIndex] = temp;

                Permutation(str, begin, startIndex + 1);

                temp = begin[i];
                begin[i] = begin[startIndex];
                begin[startIndex] = temp;
            }
        }
    }

三、单元测试

3.1 测试用例

  (1)封装测试辅助方法

    public static void TestPortal(string str)
    {
        if (string.IsNullOrEmpty(str))
        {
            Console.WriteLine("Test for NULL begins:");
            Permutation(null);
        }
        else
        {
            Console.WriteLine("Test for {0} begins:", str);
            Permutation(str.ToCharArray());
        }

        Console.WriteLine();
    }

  (2)功能测试、特殊输入测试

    public static void Test1()
    {
        TestPortal(null);
    }

    public static void Test2()
    {
        string str = "";
        TestPortal(str);
    }

    public static void Test3()
    {
        string str = "a";
        TestPortal(str);
    }

    public static void Test4()
    {
        string str = "ab";
        TestPortal(str);
    }

    public static void Test5()
    {
        string str = "abc";
        TestPortal(str);
    }

3.2 测试结果

作者:周旭龙

出处:http://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • .NET Core微服务之基于Ocelot+Butterfly实现分布式追踪

      微服务的特点决定了功能模块的部署是分布式的,以往在单应用环境下,所有的业务都在同一个服务器上,如果服务器出现错误和异常,我们只要盯住一个点,就可以快速定位和...

    Edison Zhou
  • 操作系统核心原理-3.进程原理(下):进程通信

    进程作为人类的发明,自然也免不了脱离人类的习性,也有通信的需求。如果进程之间不进行任何通信,那么进程所能完成的任务就要大打折扣。人类的通信方式无外乎对白(通过...

    Edison Zhou
  • 设计模式的征途—23.解释器(Interpreter)模式

    虽然目前计算机编程语言有好几百种,但有时人们还是希望用一些简单的语言来实现特定的操作,只需要向计算机输入一个句子或文件,就能按照预定的文法规则来对句子或文件进行...

    Edison Zhou
  • 字符串使用的小误区

      咋一看代码貌似没什么问题,简单的字符串比较。可是仔细看了看感觉哪里不对劲,运行结果却是一直是输出"UTF-32"。这里有个误区是,字符串(char *)是不...

    Qt君
  • Leetcode-Easy 709. To Lower Case

    因为很简单,自己尽量想多种方法来尝试实现,本来想使用ASCII码实现(chr,ord)但是太麻烦了,想来想去有回归到下面两种:

    致Great
  • PAT (Basic Level) Practice (中文)1057 数零壹

    给定一串长度不超过 105的字符串,本题要求你将其中所有英文字母的序号(字母 a-z 对应序号 1-26,不分大小写)相加,得到整数 N,然后再分析一下 N 的...

    C you again 的博客
  • [剑指offer] 字符串的排列

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

    尾尾部落
  • 浙大版《C语言程序设计(第3版)》题目集 习题7-6 统计大写辅音字母

    英文辅音字母是除A、E、I、O、U以外的字母。本题要求编写程序,统计给定字符串中大写辅音字母的个数。

    C you again 的博客
  • Leetcode No.7 整数反转

    假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31,  2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

    week
  • Python 基于python编写一些算法程序等

    没特意去研究,只是这对群友在QQ群里(7156436)提出的一些小程序实现、编程题,算法、问题等,本着学习的心态,根据自己的想法帮忙去编写实现而已。

    授客

扫码关注云+社区

领取腾讯云代金券