无重复字符串的排列组合

该博客探讨如何计算一个无重复字符的字符串的所有排列组合。通过示例如"qwe"和"ab",展示了排列结果,并指出问题来源于LeetCode的"Permutation I LCCI"。博主计划使用回溯法解决此问题,但详细实现尚未给出。

无重复字符串的排列组合。编写一种方法,计算某字符串的所有排列组合,字符串每个字符均不相同。

示例1:

输入:S = “qwe”
输出:[“qwe”, “qew”, “wqe”, “weq”, “ewq”, “eqw”]
示例2:

输入:S = “ab”
输出:[“ab”, “ba”]
提示:

字符都是英文字母。
字符串长度在[1, 9]之间。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/permutation-i-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

可以利用回溯法来求解:
//todo 做完相对应得一系列习题之后,再总结。

class Solution {
   
   
  
    private List<String> res = new ArrayList<>();
    private int[] temp;

    public String[] permutation(String S) {
   
   
        if(S == null)
在生成包含重复字符字符串排列组合时,关键在于避免由于重复字符导致的重复排列。C语言实现中,通常采用递归方式处理字符交换,并通过标记机制来跳过重复情况。 ### 算法思想 该算法的核心是递归与回溯结合。首先将字符串中的每个字符依次放到第一个位置,然后对剩下的字符进行递归排列。为了解决重复字符的问题,在每次循环开始前检查当前字符是否已经出现过,如果已经出现,则跳过以防止生成重复的排列结果。 ### 实现步骤 1. **定义交换函数**:用于交换字符数组中的两个指定位置的字符。 2. **定义判断重复函数**:检查当前字符是否已经在前面出现过,若已出现则返回1表示需要交换。 3. **递归函数**:尝试将每一个同的字符放在当前位置,并递归地处理后续位置。 4. **主函数**:读取输入字符串并调用递归函数,同时统计所有可能的排列数量。 ### C语言代码示例 ```c #include <stdio.h> #include <string.h> int num = 0; // 统计全排列的数量 // 交换数组中两个位置的字符 void swap(char *s, int a, int b) { char t = s[a]; s[a] = s[b]; s[b] = t; } // 判断从h到t之间是否有s[t]相同字符 int Iswap(char s[], int h, int t) { for (int j = h; j < t; j++) { if (s[j] == s[t]) return 1; } return 0; } // 递归生成全排列 void Perm(char s[], int k, int m) { if (k == m) { // 找到一个全排列 printf("%s\n", s); num++; } else { for (int i = k; i <= m; i++) { if (Iswap(s, k, i)) continue; // 如果有重复则跳过 swap(s, k, i); // 将第i个元素交换到当前层的第一个位置 Perm(s, k + 1, m); // 递归下一层 swap(s, k, i); // 回溯:恢复原数组以便下一次交换 } } } int main() { char s[20]; printf("请输入一个字符串: "); scanf("%s", s); int length = strlen(s); Perm(s, 0, length - 1); // 从索引0开始到最后一个字符 printf("总共有 %d 种同的排列。\n", num); return 0; } ``` ### 说明 - `swap` 函数负责交换字符数组中的两个位置。 - `Iswap` 函数用来检测当前尝试交换的位置是否存在重复字符[^4]。 - `Perm` 是核心递归函数,它会尝试每一种可能的排列,并且通过 `Iswap` 来避免重复排列。 - 在 `main` 函数中,程序接收用户输入的字符串,并调用 `Perm` 函数来生成所有重复的排列组合。 此方法有效地解决了含有重复字符字符串生成全排列的问题,确保输出没有重复项。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值