[剑指offer]面试题28:字符串的排列

Posted Wecccccccc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[剑指offer]面试题28:字符串的排列相关的知识,希望对你有一定的参考价值。

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

思路:
这是一个典型的递归问题,考虑如何将复杂问题分解成简单问题,最后通过递归解决。我们肯定有这样的经验,自己在写abc的全排列的时候,肯定会想首先确定第一个字符,然后考虑后面有什么排列,比如确定第一个字符为a,那么剩下的b和c有两种排列,分别是bc和cb,那么以a开头的字符串有abc,acb这两种排列。这就是我们下面程序所需要用到的解题思路。

  1. 将字符串排列分解为字符串的第一个字符以及其后的剩余字符。剩余字符串又可以按照前面的思路来解决,分解为第一个字符和剩余字符串。当最后只有一个字符的时候,程序就到达出口,这个时候输出字符串,就是其中的一个排列。
  2. 字符串abc,那么可能出现在第一个字符的可能性有三种,我们只需要每次交互第一个字符,然后计算剩余字符串的排列即可。采用递归思路解决问题。

代码如下:

void Permutation(char *pStr)
{
	if (pStr == nullptr) return;
	Permutation(pStr, pStr);
}

void Permutation(char *pStr, char *pBegin)
{
	if (*pBegin == '\\0') cout << pStr << " ";
	else
	{
		for (char *pCh = pBegin; pCh != '\\0'; pCh++)//这个for循环就是考虑某个位置出现哪个字符
		{
			char temp = *pCh;
			*pCh = *pBegin;
			*pBegin = temp;

			Permutation(pStr, pBegin + 1);//这个就是考虑后面有什么排列

			char temp = *pCh;
			*pCh = *pBegin;
			*pBegin = temp;
		}
	}
}

测试用例:
● 功能测试(输入的字符串中有1个或者多个字符)。
● 特殊输入测试(输入的字符串的内容为空或者是NULL指针)。
本题考点:
● 考查思维能力。当整个问题看起来不能直接解决的时候,应聘者能否想到把字符串分成两部分,从而把大问题分解成小问题来解决,是能否顺利解决这个问题的关键。
● 考查对递归的理解和编程能力。

以上是关于[剑指offer]面试题28:字符串的排列的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer 面试38题

剑指OFFER----面试题38. 字符串的排列

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

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

剑指offer 面试28题

剑指offer算法编程题目部分汇总(解法略)