C 演算法 字串全排列 非遞迴 非遞迴

2021-08-15 18:54:32 字數 1864 閱讀 3668

字串的全排列是面試中相對而言必要重要的演算法,有兩種實現方法:遞迴,非遞迴

替換點:從字串的最後一位開始,找到第乙個逆序的字串,如「54312」那麼從後向前第乙個逆序為12,那個1就是替換值,替換值得位置就是替換點。

非遞迴演算法思想:

對於乙個字串4231,這個字串中排列組合中1234是最小的數,4321是最大的數,上面的演算法步驟就是輸出從1234-4321的乙個有序陣列佇列。

#include 

#include

#include

#include

#include

bool find_replace_pos(const

std::string& str, size_t& rp, size_t& min_max) else }}

}if (min_max != std::string::npos)

if (rp == 0)

--rp;

}return

false;

}void swap(std::string& str, size_t from, size_t to)

std::string::value_type tmp = str.at(from);

str[from] = str.at(to);

str[to] = tmp;

}void reverse(std::string& str, size_t start, size_t end)

}void permutation(std::string str, std::vector

& ret)

size_t end = str.size() - 1;

size_t rp = std::string::npos;

size_t min_max = std::string::npos;

std::sort(str.begin(), str.end());

ret.push_back(str);

while (find_replace_pos(str, rp, min_max))

}int main()

std::cout

<< "ret size:"

<< ret.size() << std::endl;

return

0;}

遞迴演算法思想:

乙個字串有n個字串,那個全排列的定義本身就是乙個遞迴定義(在不考慮重複字元時),n個字元一次固定在首位排列組合*剩餘n-1個字串的排列組合。

#include 

#include

#include

#include

#include

void swap(std::string& str, size_t from, size_t to)

std::string::value_type tmp = str.at(from);

str[from] = str.at(to);

str[to] = tmp;

}// 遞迴方法

// permutation(n)

void permutation(std::string& str, size_t start, size_t end, std::vector

& ret)

for (size_t index = start; index < end; ++index)

}int main()

std::cout

<< "ret size:"

<< ret.size() << std::endl;

return

0;}

字串全排列 非遞迴實現

乙個演算法命題 給定字串s 0 n 1 設計演算法,列舉s的全排列。如 123,全排列就是 123,132,213,231,312,321 由123的全排列 123,132,213,231,312,321可知,這個全排列大小是有序的。也就是說,從最小的開始排列,每次只找比當前排列大一點的序列即可,這...

字串的全排列詳解,遞迴 非遞迴

輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則輸出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba 首先,我們固定第乙個字元a,求後面兩個字元bc的排列 當兩個字元bc排列求好之後,我們把第乙個字元a和後面的b交換,得到bac,接著我們固定第乙...

全排列 非遞迴

description 列出所有數字1到數字n的連續自然數的排列,要求所產生的任一數字序列中不允許出現得復數字。input 輸入 n 1 n 9 output 由1 n組成的所有不重複的數字序列,每行乙個序列。sample input 3 sample output 1 2 3 1 3 2 2 1 ...