专业电商网站建设哪家好,书店网站建设需求分析调研表,太原推广型网站制作,网页设计与制作课程目标51. N皇后
按照国际象棋的规则#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上#xff0c;并且使皇后彼此之间不能相互攻击。
给你一个整数 n #xff0c;返回所有不同的 n 皇后问题 的解决方…51. N皇后
按照国际象棋的规则皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上并且使皇后彼此之间不能相互攻击。
给你一个整数 n 返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案该方案中 Q 和 . 分别代表了皇后和空位。
示例 1 输入n 4
输出[[.Q..,...Q,Q...,..Q.],[..Q.,Q...,...Q,.Q..]]
解释如上图所示4 皇后问题存在两个不同的解法。示例 2
输入n 1
输出[[Q]]
思路也是做可以作为回溯算法的题型把每一种情况枚举出来判断可不可行。不过在这一题中判断是否可行好像需要花一点功夫拿出来单独写一个函数好了。对整个棋盘可以一行一行处理每处理一行只需要判断前面添加过的行是否能满足要求。初始化棋盘的时候需要注意一个vector中要有n个有n个‘.’的字符串。
代码实现
class Solution {
private:vectorvectorstring result;void backTrace(int row, int n, vectorstring chessboard) {if(row n) { //添加到n行result.push_back(chessboard);return;}for(int col 0; col n; col) {if(isValid(row, col, chessboard, n)) {chessboard[row][col] Q;backTrace(row 1, n, chessboard);chessboard[row][col] .;}}}bool isValid(int row, int col, vectorstring chessboard, int n) {for(int i 0; i row; i) { //判断前面的每一行是否有皇后if(chessboard[i][col] Q) {return false;}}for(int i row - 1, j col - 1; i 0 j 0; --i, --j) {if(chessboard[i][j] Q) { //判断45度角return false;}}for(int i row - 1, j col 1; i 0 j n; --i, j) {if(chessboard[i][j] Q) { //判断135度角return false;}}return true;}
public:vectorvectorstring solveNQueens(int n) {vectorstring chessboard(n, string(n, .));backTrace(0, n, chessboard);return result;}
};
76. 最小覆盖子串
给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串则返回空字符串 。
注意
对于 t 中重复字符我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。如果 s 中存在这样的子串我们保证它是唯一的答案。
示例 1
输入s ADOBECODEBANC, t ABC
输出BANC
解释最小覆盖子串 BANC 包含来自字符串 t 的 A、B 和 C。示例 2
输入s a, t a
输出a
解释整个字符串 s 是最小覆盖子串。示例 3:
输入: s a, t aa
输出:
解释: t 中两个字符 a 均应包含在 s 的子串中
因此没有符合条件的子字符串返回空字符串。 思路运用滑动窗口的思想遍历对出现过的字符用哈希表计数利用两个哈希表中特定字符数量大于或等于来延长子串维护滑动窗口最后用if判断哪个子串更短。其中还需要一个valid值来记录有几个字符出现过了valid t.size( )就是终止条件。
代码实现
class Solution {
public:string minWindow(string s, string t) {string ret s;unordered_mapchar,int smap, tmap;for(char c : t) {tmap[c];}int i 0;int valid 0;bool flag false;for(int j 0; j s.size(); j) {smap[s[j]]; //维护rightif(tmap[s[j]] smap[s[j]]) { //计数valid;}while(smap[s[i]] tmap[s[i]]) { //缩短窗口left--smap[s[i]];i;}if(valid t.size()) {flag true;if(j - i 1 ret.size()) { //保留最小子串ret s.substr(i, j - i 1);}}}if(flag false) {return ;}return ret;}
};