1. 程式人生 > >字串的排列方式

字串的排列方式

class Solution
{
public:
	vector<string>Permution(string str)
	{
		//判斷輸入
		if(str.length()==0)
		{
			return result;
		}
		
		PermutionCore(str,0);
		
		return result;
	}
private:
	void PermutionCore(string str,int begin)
	{
		if(begin==str.length())
		{
			result.push_back(str);
			return;
		}
		for(int i=begin;i<str.length();i++)
		{
			if(i!=begin&&str[i]==str[begin])
				continue;
			
			swap(str[begin],str[i]);
			
			PermutionCore(str,begin+1);
		}
	}
	vector<string>result;
};

題目

輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。

輸入描述:

輸入一個字串,長度不超過9(可能有字元重複),字元只包括大小寫字母。

思路

我們求整個字串的排列,可以看成兩步:首先求所有可能出現在第一個位置的字元,即把第一個字元和後面所有的字元交換。如下圖所示:

劍指Offer(二十七):字串的排列

上圖就是分別把第一個字元a和後面的b、c等字元交換的情形。首先固定第一個字元,求後面所有字元的排列。這個時候我們仍把後面的所有字元分為兩部分:後面的字元的第一個字元,以及這個字元之後的所有字元。然後把第一個字元逐一和它後面的字元交換。

這個思路,是典型的遞迴思路。