問題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用來表...