【劍指offer】面試題38. 字符串的排列

解題思路

第一步求所有可能出現在第一個位置的字符,即把第一個字符和後面的所有字符交換。
第二步固定第一個字符,求後面所有字符的排列。
這時候仍然把後面的所有字符分成兩部分:後面字符的第一個字符,以及這個字符之後的所有字符。然後把第一個字符逐一和它後面的字符交換。
舉例如下
以字符串"abc"爲例
image.png
對於重複結果的處理,我採用set進行解決

代碼

class Solution {
public:

	vector<string> res;
	set<string> tempRes;
	vector<string> permutation(string s) {
		if (s.size() == 0) return res;//字符串排列
		solvePermutation(s, &s[0]);
		for (set<string>::iterator it=tempRes.begin();it!=tempRes.end();it++)
		{
			res.push_back(*it);
		}
		return res;
	}
	void solvePermutation(string& s, char* sBegin)
	{
		//sBegin所指字符爲空'\0',將當前字符串s存儲起來
		if (*sBegin == '\0') tempRes.insert(s);
		else
		{
			//將字符串s中的字符從sBegin位置開始依次和當前字符串的首字符交換位置
			for (char* sCh = sBegin; *sCh != '\0'; sCh++)
			{
				//交換位置
				char temp = *sBegin;
				*sBegin = *sCh;
				*sCh = temp;
				//交換完後繼續全排列
				solvePermutation(s, sBegin + 1);
				//回溯
				temp = *sBegin;
				*sBegin = *sCh;
				*sCh = temp;
			}
		}
	}
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章