解题思路

这是一个全排列问题。需要生成给定字符串中所有字符的排列,并按字典序排序输出。

关键点:

  1. 字符串长度在1-9之间
  2. 所有字符都是不同的大写字母
  3. 需要按字典序排序
  4. 每个排列占一行

算法步骤:

  1. 将字符串转换为字符数组
  2. 对字符数组排序获得初始排列
  3. 不断生成下一个排列
  4. 按顺序输出所有排列

代码

#include <bits/stdc++.h>
using namespace std;

class Solution {
public:
    vector<string> getAllPermutations(string s) {
        vector<string> result;
        
        // 先排序得到字典序最小的排列
        sort(s.begin(), s.end());
        
        // 不断生成下一个排列
        do {
            result.push_back(s);
        } while (next_permutation(s.begin(), s.end()));
        
        return result;
    }
};

int main() {
    string s;
    cin >> s;
    
    Solution solution;
    vector<string> result = solution.getAllPermutations(s);
    
    // 输出所有排列
    for (const string& perm : result) {
        cout << perm << endl;
    }
    
    return 0;
}
import java.util.*;

public class Main {
    static class Solution {
        public List<String> getAllPermutations(String s) {
            List<String> result = new ArrayList<>();
            char[] chars = s.toCharArray();
            
            // 先排序得到字典序最小的排列
            Arrays.sort(chars);
            
            // 不断生成下一个排列
            do {
                result.add(new String(chars));
            } while (nextPermutation(chars));
            
            return result;
        }
        
        private boolean nextPermutation(char[] arr) {
            // 1. 找到最后一个升序位置
            int i = arr.length - 2;
            while (i >= 0 && arr[i] >= arr[i + 1]) {
                i--;
            }
            if (i < 0) return false;
            
            // 2. 找到第一个大于arr[i]的位置
            int j = arr.length - 1;
            while (arr[j] <= arr[i]) {
                j--;
            }
            
            // 3. 交换并反转
            swap(arr, i, j);
            reverse(arr, i + 1, arr.length - 1);
            return true;
        }
        
        private void swap(char[] arr, int i, int j) {
            char temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
        
        private void reverse(char[] arr, int left, int right) {
            while (left < right) {
                swap(arr, left++, right--);
            }
        }
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine().trim();
        
        Solution solution = new Solution();
        List<String> result = solution.getAllPermutations(s);
        
        // 输出所有排列
        for (String perm : result) {
            System.out.println(perm);
        }
        
        sc.close();
    }
}
class Solution:
    def get_all_permutations(self, s: str) -> list:
        def next_permutation(arr):
            # 1. 找到最后一个升序位置
            i = len(arr) - 2
            while i >= 0 and arr[i] >= arr[i + 1]:
                i -= 1
            if i < 0:
                return False
            
            # 2. 找到第一个大于arr[i]的位置
            j = len(arr) - 1
            while arr[j] <= arr[i]:
                j -= 1
            
            # 3. 交换并反转
            arr[i], arr[j] = arr[j], arr[i]
            left = i + 1
            right = len(arr) - 1
            while left < right:
                arr[left], arr[right] = arr[right], arr[left]
                left += 1
                right -= 1
            return True
        
        # 转换为列表并排序
        chars = list(s)
        chars.sort()
        result = []
        
        # 生成所有排列
        while True:
            result.append(''.join(chars))
            if not next_permutation(chars):
                break
        
        return result

if __name__ == "__main__":
    s = input().strip()
    
    solution = Solution()
    result = solution.get_all_permutations(s)
    
    # 输出所有排列
    for perm in result:
        print(perm)

算法及复杂度

  • 算法:字典序法生成全排列
  • 时间复杂度:,其中 是字符串长度
  • 空间复杂度:,用于存储所有排列