【一刷《劍指Offer》】面試題 28:字符串的排列

牛客對應題目鏈接:字符串的排列_牛客題霸_牛客網 (nowcoder.com)

力扣對應題目鏈接:LCR 157. 套餐內商品的排列順序 - 力扣(LeetCode)

核心考點 :全排列問題, DFS。

一、《劍指Offer》對應內容


二、分析題目

全排列問題,可以看做如下多叉樹形態:

很明顯,我們想要得到合適的排列組合,一定是深度優先的。該問題可以把目標串理解成兩部分:

  • 第一部分:以哪個字符開頭。
  • 第二部分:剩下的是子問題。
所以,我們要讓每個字符都要做一遍開頭,然后再求解子問題。

三、代碼

//牛客
//寫法一
class Solution {
private:set<string> ans;vector<string> res;
public:/*** 代碼中的類名、方法名、參數名已經指定,請勿修改,直接返回方法規定的值即可** * @param str string字符串 * @return string字符串vector*/void swap(string &str, int i, int j){char temp=str[i];str[i]=str[j];str[j]=temp;}void dfs(string &str, int start){if(start==str.length()-1){ans.insert(str);return;}for(int i=start; i<str.size(); i++){swap(str, start, i);dfs(str, start+1);swap(str, start, i);}}vector<string> Permutation(string str) {int n=str.size();if(n<1) return {""};dfs(str, 0);for(auto s : ans)res.push_back(s);return res;}
};//寫法二
class Solution {
private:set<string> ans;
public:/*** 代碼中的類名、方法名、參數名已經指定,請勿修改,直接返回方法規定的值即可** * @param str string字符串 * @return string字符串vector*/void dfs(string &str, int pos){if(pos==str.length()-1){ans.insert(str);return;}for(int i=pos; i<str.size(); i++){swap(str[pos], str[i]);dfs(str, pos+1);swap(str[pos], str[i]);}}vector<string> Permutation(string str) {if(str.size()<1) return {""};dfs(str, 0);return vector<string>({ans.begin(), ans.end()});}
};//力扣
class Solution {
private:set<string> ans;vector<string> res;
public:void dfs(string& goods, int pos){if(pos==goods.size()-1){ans.insert(goods);return;}for(int i=pos; i<goods.size(); i++){swap(goods[pos], goods[i]);dfs(goods, pos+1);swap(goods[pos], goods[i]);}}vector<string> goodsOrder(string goods) {dfs(goods, 0);for(auto s : ans)res.push_back(s);return res;}
};

四、擴展


五、相關題目

1、正方體的三面和

輸入一個含有 8 個數字的數組,判斷有沒有可能把這 8 個數字分別放到正方體的 8 個頂點上(如圖 4.15 所示),使得正方體上三組相對的面上的 4 個頂點的和都相等。

這相當于先得到 a1、a2、a3、a4、a5、a6、a7 和 a8 這 8 個數字的所有排列,然后判斷有沒有某一個的排列符合題目給定的條件,即 a1+a2+a3+a4==a5+a6+a7+a8,a1+a3+a5+a7==a2+a4+a6+a8,并且 a1+a2+a5+a6==a3+a4+a7+a8。


2、八皇后

在 8 X 8 的國際象棋上擺放 8 個皇后,使其不能相互攻擊,即任意兩個皇后不得處在同一行、同一列或者同一對角線上。圖 4.16 中的每個黑色格子表示一個皇后,這就是一種符合條件的擺放方法。請問總共有多少種符合條件的擺法?

由于 8 個皇后的任意兩個不能處在同一行,那么肯定是每一個皇后占據一行。于是我們可以定義一個數組 ColumnIndex[8],數組中第 i 個數字表示位于第 i 行的皇后的列號。先把 ColumnIndex 的 8 個數字分別用 0~7 初始化,接下來就是對數組 ColumnIndex 做全排列。因為我們是不同的數字初始化數組,所以任意兩個皇后肯定不同列。我們只需判斷每一個排列對應的 8 個皇后是不是在同意對角線上,也就是對于數組的兩個下標 i 和 j,是不是 i-j==ColumnIndex[i]-ColumnIndex[j] 或者 j-i==ColumnIndex[i]-ColumnIndex[j]。


力扣對應類似題目鏈接:51. N 皇后 - 力扣(LeetCode)

//寫法一
class Solution {
private:vector<string> path;vector<vector<string>> res;vector<bool> checkCol, checkDg, checkUdg;
public:void dfs(int row, int n){if(row==n){res.push_back(path);return;}for(int col=0; col<n; col++){if (!checkCol[col] && !checkDg[row-col+n] && !checkUdg[row+col]){path[row][col]='Q';checkCol[col]=checkDg[row-col+n]=checkUdg[row+col]=true;dfs(row+1, n);checkCol[col]=checkDg[row-col+n]=checkUdg[row+col]=false;path[row][col]='.';}}}vector<vector<string>> solveNQueens(int n) {checkCol = vector<bool>(n, false);checkDg = vector<bool>(2*n, false);checkUdg = vector<bool>(2*n, false);path.resize(n);for(int i=0; i<n; i++)path[i].append(n, '.');dfs(0, n);return res;}
};//寫法二
class Solution {
public:vector<vector<string>> res;void dfs(int x, int n, vector<string>& chessboard){if(x==n){res.push_back(chessboard);return;}for (int y=0; y<n; y++){if (isValid(x, y, n, chessboard)){chessboard[x][y]='Q';dfs(x+1, n, chessboard);chessboard[x][y]='.';}}}bool isValid(int x, int y, int n, vector<string>& chessboard){// 檢查列for (int i=0; i<x; i++){if (chessboard[i][y]=='Q')return false;}// 檢查 45度角是否有皇后for (int i=x-1, j=y-1; i>=0 && j>=0; i--, j--){if (chessboard[i][j]=='Q')return false;}// 檢查 135度角是否有皇后for(int i=x-1, j=y+1; i>=0 && j<n; i--, j++){if (chessboard[i][j]=='Q')return false;}return true;}vector<vector<string>> solveNQueens(int n) {vector<string> chessboard(n, string(n, '.'));dfs(0, n, chessboard);return res;}
};

六、舉一反三

如果面試題是按照一定要求擺放若干個數字,我們可以先求出這些數字的所有排列,然后再一一判斷每個排列是不是滿足題目給定的要求。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/21284.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/21284.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/21284.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JS(DOM、事件)

DOM 概念:Document Object Model&#xff0c;文檔對象模型。將標記語言的各個組成部分封裝為對應的對象: Document:整個文檔對象Element:元素對象Attribute:屬性對象Text:文本對象Comment:注釋對象 JavaScript通過DOM&#xff0c;就能夠對HTML進行操作: 改變 HTML 元素的內…

Windows端口本地轉發

參考 微軟Netsh interface portproxy 命令 界面端口代理的 Netsh 命令 | Microsoft Learn 使用Windows系統的portproxy功能配置端口轉發 使用Windows系統的portproxy功能配置端口轉發-阿里云幫助中心 (aliyun.com) 將來自0.0.0.0地址對端口35623的訪問轉發到172.18.106.16…

SpringBoot @ModelAttribute注解的深入指南

文章目錄 前言一、基本概念二、方法級別的@ModelAttribute1. 用途2. 示例三、參數級別的@ModelAttribute1. 用途2. 示例四、處理多個@ModelAttribute1. 示例五、繼承與@ModelAttribute注解的結合使用1. 示例1.1 基類(父類)1.2 子類(具體控制器)<

多維數組找最大值

調用JavaScript的一個內置函數&#xff1a;Math.max() <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title…

虛擬機VMware Workstation 常用的快捷方式

1、 虛擬機軟件&#xff0c;如 VMware Workstation、VirtualBox 等 所使用的是 VMware Workstation 2、快捷方式 2.1 切換鼠標和鍵盤焦點 CtrlAlt&#xff1a;從虛擬機中釋放鼠標和鍵盤&#xff0c;回到主機 2.2 全屏模式 2.2.1 進入全屏模式: CtrlAltEnter 2.2.2 退出全…

政安晨:【Keras機器學習示例演繹】(五十一)—— 利用廣義網絡、深度網絡和交叉網絡進行結構化數據學習

政安晨的個人主頁&#xff1a;政安晨 歡迎 &#x1f44d;點贊?評論?收藏 收錄專欄: TensorFlow與Keras機器學習實戰 希望政安晨的博客能夠對您有所裨益&#xff0c;如有不足之處&#xff0c;歡迎在評論區提出指正&#xff01; 本文目標&#xff1a;使用 "寬深 "和 …

Python 技能提升(三)

global 和 nonlocal b 全局變量 global variabledef foo():a 局部變量 local variable# 在局部里面操作全局變量&#xff0c;需要加上聲明global bb b &#xff01;&#xff01;&#xff01;print(b)foo() # 全局變量 global variable&#xff01;&#xff01;&#xff01…

Python 遞歸函數一例

現有示例數據 # 示例數據 pending_join [ {increment: "department Finance", statement_index: 0}, {increment: "name Lisa", statement_index: 2}, {increment: "gender Female", statement_index: 3}, {increment: "hire_date <…

redis如何實現分布式鎖

Redisson是怎么實現分布式鎖的 分布式鎖&#xff1a;Redisson 提供了一種簡單而強大的方式來實現分布式鎖。 它支持多種鎖模式&#xff0c;如公平鎖、可重入鎖、讀寫鎖等&#xff0c;并且提供了鎖的超時設置和自動釋放功能。 鎖的獲取 在Redisson中常見獲取鎖的方式有 lock() …

【代碼隨想錄訓練營】【Day 37】【貪心-4】| Leetcode 840, 406, 452

【代碼隨想錄訓練營】【Day 37】【貪心-4】| Leetcode 840, 406, 452 需強化知識點 python list sort的高階用法&#xff0c;兩個key&#xff0c;另一種逆序寫法python list insert的用法 題目 860. 檸檬水找零 思路&#xff1a;注意 20 塊找零&#xff0c;可以找3張5塊升…

Mysql基礎教程(13):GROUP BY

MySQL GROUP BY 【 GROUP BY】 子句用于將結果集根據指定的字段或者表達式進行分組。 有時候&#xff0c;我們需要將結果集按照某個維度進行匯總。這在統計數據的時候經常用到&#xff0c;考慮以下的場景&#xff1a; 按班級求取平均成績。按學生匯總某個人的總分。按年或者…

“世界酒中國菜”系列活動如何助推鄉村振興和文化交流?

"世界酒中國菜"系列活動如何助推鄉村振興和文化交流&#xff1f; 《經濟參考報》&#xff08;2024年5月24日 第6版&#xff09; 新華社北京&#xff08;記者 張曉明&#xff09; “世界酒中國菜”系列活動自啟動以來&#xff0c;已在國內外產生了廣泛影響。這一國家…

mysql面試之分庫分表總結

文章目錄 1.為什么要分庫分表2.分庫分表有哪些中間件&#xff0c;不同的中間件都有什么優點和缺點&#xff1f;3.分庫分表的方式(水平分庫,垂直分庫,水平分表,垂直分表)3.1 水平分庫3.2 垂直分庫3.3 水平分表3.4 垂直分表 4.分庫分表帶來的問題4.1 事務一致性問題4.2 跨節點關聯…

【退役之重學 SQL】什么是笛卡爾積

一、初識笛卡爾積 概念&#xff1a; 笛卡爾積是指在關系型數據庫中&#xff0c;兩個表進行 join 操作時&#xff0c;沒有指定任何條件&#xff0c;導致生成的結果集&#xff0c;是兩個表中所有行的組合。 簡單來說&#xff1a; 笛卡爾積是兩個表的乘積&#xff0c;結果集中的每…

力扣 454題 四數相加Ⅱ 記錄

題目描述 給你四個整數數組 nums1、nums2、nums3 和 nums4 &#xff0c;數組長度都是 n &#xff0c;請你計算有多少個元組 (i, j, k, l) 能滿足&#xff1a; 0 < i, j, k, l < n nums1[i] nums2[j] nums3[k] nums4[l] 0示例 1&#xff1a; 輸入&#xff1a;nums1 …

Flutter 中的 SliverOpacity 小部件:全面指南

Flutter 中的 SliverOpacity 小部件&#xff1a;全面指南 Flutter 是一個功能強大的 UI 框架&#xff0c;由 Google 開發&#xff0c;允許開發者使用 Dart 語言來構建高性能、美觀的跨平臺應用。在 Flutter 的滾動組件體系中&#xff0c;SliverOpacity 是一個用來為其子 Slive…

強化學習中Q值的概念

在強化學習中&#xff0c;Q值是一個非常核心的概念&#xff0c;用來表示在給定的狀態下&#xff0c;采取某個特定動作所期望獲得的總回報。Q值基本上是一種衡量“動作價值”的方式&#xff0c;即在當前狀態采取一個動作能帶來多大價值。 定義和計算 Q值通常表示為 (Q(s, a))&…

RabbitMQ小結

MQ分類 Acitvemq kafka 優點&#xff1a;性能好&#xff0c;吞吐量高百萬級&#xff0c;分布式&#xff0c;消息有序 缺點&#xff1a;單機超過64分區&#xff0c;cpu會飆高&#xff0c;消費失敗不支持重試 &#xff0c; Rocket 阿里的mq產品 優點&#xff1a;單機吞吐量也…

香橙派 Kunpeng Pro:基于ncnn的深度學習模型量化與部署實踐

一 引言 近10年里以深度學習為代表的機器學習技術在圖像處理&#xff0c;語音識別&#xff0c;自然語言處理等領域里取得了非常多的突破&#xff0c;其背后的核心算法是深度學習為代表的AI基礎模型。 一般來講&#xff0c;我們進行AI項目研發時&#xff0c;遵循三個步驟。 第…