JZ27 字串的排列

2021-10-21 10:33:14 字數 1723 閱讀 4197

知識點:遞迴、全排列

題目鏈結

題目描述

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

輸入乙個字串,長度不超過9(可能有字元重複),字元只包括大小寫字母。

示例1

輸入:「ab」

返回值:[「ab」,「ba」]

解題思路

和leetcode刷題筆記 31. 下乙個排列一樣的思路

首先從尾向頭找 str[i] < str[i+1] ,若找到說明 [i+1,n) 都是降序的再從尾從頭找第乙個 比str[i]大的 str[j] > str[i]

交換str[i] 和 str[j] 再翻轉區間[i+1,n)的讓他變成公升序

這樣就得到了下乙個公升序

舉例

3415731

str[i]=5

str[j]=7

swap 3417531

reverse 3417135

方法二: 使用遞迴 每次交換乙個字串

遞迴跳出條件:如果長度到達了要求用find函式 或者 set 來去重 把答案放入遞迴步驟:從長度到最長長度 遍歷交換乙個位置相當於 我們自己手動模擬 先定下第乙個數 再對後面的改變

遞迴完記得回溯

方法三: 可以弄乙個空的字串 每次往裡面填資料

**

#include

"cheader.h"

class

solution

return ans;

} string nextstr

(string str)};

class

solution2

void

dfs(string s,

int index)

set<

int> st;

for(

int i = index; i < s.

size()

; i++

)return;}

};class

solution3

void

dfs(vector<

int>

& tmp,vector<

int>

& nums,vector<

int>

& vis)

if(tmp.

size()

> nums.

size()

)return

;for

(int i =

0; i < nums.

size()

; i++)}

}};int

main()

今天也是愛zz的一天!

JZ27 字串的排列

題目描述 輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則按字典序列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。輸入描述 輸入乙個字串,長度不超過9 可能有字元重複 字元只包括大小寫字母。示例1輸入 輸出 ab ab ba 字典...

JZ27 劍指offer 字串的排列

題目描述 輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則按字典序列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。class solution def permutation self,s str list str c,res l...

27 字串的排列

題目 輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。思路 全排列,採用遞迴。1 首先,我們固定第乙個字元a,求後面兩個字元bc的排列 2 當兩個字元bc排列求好之後,我們把第乙個字...