[剑指offer]面试题第[38]题[JAVA][字符串的排列][回溯法]
生活随笔
收集整理的這篇文章主要介紹了
[剑指offer]面试题第[38]题[JAVA][字符串的排列][回溯法]
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【問題描述】[中等]
輸入一個字符串,打印出該字符串中字符的所有排列。 你可以以任意順序返回這個字符串數組,但里面不能有重復元素。示例: 輸入:s = "abc" 輸出:["abc","acb","bac","bca","cab","cba"]限制: 1 <= s 的長度 <= 8【解答思路】
回溯法
時間復雜度:O(N!) 空間復雜度:O(N^2)
2.
時間復雜度:O(N) 空間復雜度:O(1)
import java.util.ArrayList; import java.util.Arrays; import java.util.List;public class Solution {public String[] permutation(String s) {int len = s.length();if (len == 0) {return new String[0];}// 轉換成字符數組是常見的做法char[] charArr = s.toCharArray();// 排序是為了去重方便Arrays.sort(charArr);// 由于操作的都是字符,使用 StringBuilderStringBuilder path = new StringBuilder();boolean[] used = new boolean[len];// 為了方便收集結果,使用動態數組List<String> res = new ArrayList<>();dfs(charArr, len, 0, used, path, res);// 記得轉成字符串數組return res.toArray(new String[0]);}/*** @param charArr 字符數組* @param len 字符數組的長度* @param depth 當前遞歸深度* @param used 當前字符是否使用* @param path 從根結點到葉子結點的路徑* @param res 保存結果集的變量*/private void dfs(char[] charArr,int len,int depth,boolean[] used,StringBuilder path,List<String> res) {if (depth == len) {// path.toString() 恰好生成了新的字符對象res.add(path.toString());return;}for (int i = 0; i < len; i++) {if (!used[i]) {if (i > 0 && charArr[i] == charArr[i - 1] && !used[i - 1]) {continue;}used[i] = true;path.append(charArr[i]);dfs(charArr, len, depth + 1, used, path, res);// 遞歸完成以后,需要撤銷選擇,遞歸方法執行之前做了什么,遞歸方法執行以后就需要做相應的逆向操作path.deleteCharAt(path.length() - 1);used[i] = false;}}}public static void main(String[] args) {Solution solution = new Solution();String[] res = solution.permutation("aba");System.out.println(Arrays.toString(res));} }【總結】
1.回溯法 剪枝+恢復狀態
2.collection.toArray(new String[0])中new String[0]的語法解釋(指定泛型)
3. 寫法二會比寫法一 好理解
轉載鏈接:https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof/solution/mian-shi-ti-38-zi-fu-chuan-de-pai-lie-hui-su-fa-by/
參考鏈接:https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof/solution/hui-su-suan-fa-java-by-liweiwei1419/
總結
以上是生活随笔為你收集整理的[剑指offer]面试题第[38]题[JAVA][字符串的排列][回溯法]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MobX快速入门教程(重要概念讲解)
- 下一篇: dedecms后台怎么添加发布软件?织梦