面試題38 字串的排列

2021-09-22 21:08:33 字數 3140 閱讀 8377

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

思路:"abcde",第一輪,a與b交換,a與c交換,a與d交換,a與e交換,

其中a每次都要回到原來的位置

第二輪,a固定,"bcde"進行上述的情形,

b與c交換,b與d交換,b與e交換,

其中b每次都要回到原來的位置

...全部排列完畢

class solution

void permutation(vector&array, string str, int begin)

//遍歷第begin位的所有可能性

}};

回溯法

/*

這是乙個字串排列問題,考慮使用回溯法

可以分為兩部分來做

第一部分:求所有可能在第乙個位置的字元,即把第乙個字元與後面所有字元交換,包括自己和自己交換

第二部分:固定第乙個字元,求後面所有字元的排列,即又回到第一部分

其中注意乙個問題:如果第乙個字元與後面某乙個位置字元相同,則不用交換*/

class solution

string tmp;

recur(str, tmp, all, 0);

return all;

}void recur(string str, string& tmp, vector&all, int start)

if(str.size() == start)

for(int i = start; i < str.size(); i++)

swap(str[i], str[start]);

tmp += str[start];

recur(str, tmp, all, start + 1);

tmp.pop_back(); //回溯法的關鍵}}

};

問題2:輸入乙個字串,輸出該字串中字元的所有組合。舉個例子,如果輸入abc,它的組合有a、b、c、ab、ac、bc、abc。

//從頭掃瞄字串得到第乙個字元,針對第乙個字元,有兩種選擇

//把這個字元放到組合中去,接下來我們需要在剩下的n-1個字元中選取m-1個字元;

//如果不把這個字元放到組合中去,則需要在剩下的n-1個字元中選取m個字元

//函式功能 : 從乙個字串中選m個元素

//函式引數 : pstr為字串, m為選的元素個數, result為選中的

//返回值 : 無

void combination_m(char *pstr, int m, vector&result)

}

/*

輸入n個字元,那麼形成的組合長度有1、2、... 、n

在n個字元中求長m的字元時,可以分成兩部分:第乙個字元和其餘所有字元

如果組合中包含第乙個字元,則在剩餘字元中求m-1個字元

如果組合中不包含第乙個字元,則在剩餘字元中求m個字元

就可以用遞迴的方法求解

*/class solution

string tmp;

for (int i = 1; i <= str.size(); i++)

return all;

}void recur(string str, string &tmp, int start, int number, vector& all)

if (start == str.size())

if (number > str.size() - start)

tmp += str[start];

recur(str, tmp, start + 1, number - 1, all);

tmp.pop_back();

recur(str, tmp, start + 1, number, all);

}};

問題3:n皇后問題,在乙個n*n的棋盤上放置n個皇后,使其不能互相攻擊(同一行、同一列、同一斜線上的皇后都會自動攻擊),即任意兩個皇后不得處於同一行、同一列、同意斜線上。

/*

經典的n皇后問題

假如n=4

我們可以定義乙個陣列column[4],陣列中第i個數字表示位於第i行的皇后的列號

並將0,1,2,3分別放入陣列中,放入的時候判斷是否在同一列以及是否時一條斜線

它們肯定不會在同一行,因為陣列下標0,1,2,3各不相同,因此所在行肯定不同

*/class solution

vectorvec(n);

int sum = 0;

queencore(0, n, vec, sum);

return sum;

}void queencore(int index, int n, vector&vec, int &sum) else }}

}bool diagonal(const vector&vec, int index)

}return true;

}}

問題4:輸入乙個含有8個數字的陣列,判斷有沒有可能把這8個數字分別放在正方體的8個頂點上,使得正方體上三組相對的面上的4個頂點的和都相等。

/*

簡而言之,這就是乙個全排列問題

把這8個數全排列,之後判斷正方體的三個像對面是否相等即可

*/class solutin

return cubecore(vec, 0);

}bool cubecore(vector& vec, int start)

bool result = false;

if (start == vec.size() - 1)

} else

swap(vec[i], vec[start]);

result = cubecore(vec, start + 1);

if (result)

swap(vec[i], vec[start]);

}} return result;

}int sum(vectorvec, int i, int j, int k, int l)

}

面試題38 字串的排列

題目 輸入乙個字串,列印出該字串中字元的所有排列。你可以以任意順序返回這個字串陣列,但裡面不能有重複元素。示例 輸入 s abc 輸出 abc acb bac bca cab cba 參考思路 外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳 img mbntu64f 1607042717...

面試題38 字串的排列

1 題目描述 輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則按字典序列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。2 輸入 str3 輸出 str的全排列 可能有字元重複 字元只包括大小寫字母。4 樣例輸入 abc 5 樣例輸...

回溯 面試題38 字串的排列(medium)

題目 題解 如下 class solution set res visit.resize s.size false string str backtrack s,res,str,0,int s.size return vector res.begin res.end 回溯法基本框架 index用來表...