昨天做了一套cvte的面試題,最後乙個題目就是字串的全排列。做過劍指offer的童鞋一眼就可以看出這是劍指offer-28題
原題目,一點都沒變
把字串看成兩個部分,第乙個部分為第乙個字元,剩下的是後面的字元
首先將所有可能出現在第乙個位置的字元,將這些字元在每次迴圈的時候和第乙個字元交換、
先固定乙個字元,求後面字元的排列
然後將後面的字元按照前面的方法分成兩部分,遞迴
//面試題28:字串的全排列
//pstr表示要列印的字串,pbegin表示從該位置開始交換字元
void _per(char* pstr, size_t start, size_t end)
//注意,這裡pch不能初始為pbegin+1
for (size_t index = start; index != end; ++index) }
void per(char* pstr)
void testper()
1、cout<
2、原書中用的都是指標,原書中交換是手動交換的,而我這裡用下標來表示,用偏移加解引用比較方便點,不易出錯
3、std::swap交換要注意,不能寫成交換兩個指標了
用stl提供的演算法
sort和next_permutation可以快速的求出全排列
#includevoid per(char *str)
}void testper()
劍指Offer28 字串排列問題
輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則列印出字元a b c所能排列出來 的所有字串abc bac bca cab cba。求整個字串的全排列,可以看成兩步 第一步 首先求所有可能出現在第乙個位置的字元,即把第乙個字元和後面所有的字元交換 第二步 固定第乙個字元,求後面所有...
劍指offer 面試題28 字串的排列
題目描述 輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c 所能排列出來的所有字串abc,acb,bac bca,cab 和cba 題目分析 可以分成兩步。第一步求所有可能出現在第乙個位置的字元,即把第乙個字元和後面所有的字元交換。第二步固定第乙個字元,求後面...
《劍指Offer》面試題28 字串的排列
劍指offer 面試題28 字串的排列 字串的全排列和組合演算法 遞迴輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則列印出字元a b c所排列出來的所有字串abc acb bac bca cab和cba。輸入乙個字串,輸出該字串中字元的所有組合。舉個例子,如果輸入abc,它的組合...