首页 > 其他分享 >剑指 Offer 38 字符串的排列

剑指 Offer 38 字符串的排列

时间:2022-12-21 11:26:05浏览次数:40  
标签:index 38 Offer res 排列 str 字符 字符串

剑指 Offer 38 | 字符串的排列

输入一个字符串,打印出该字符串中字符的所有排列。

你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。

示例:
输入:s = "abc"
输出:["abc","acb","bac","bca","cab","cba"]
  • 限制:
    1 <= s 的长度 <= 8

思路:大问题分解为小问题,字符串的长度为len,固定当前字符,则当前字符固定时,字符串的全排列为剩下的len-1个字符的全排列(可以想象一下密码箱,固定一个密码,剩下的有多少种排列)。一直递归下去,遇到最后一个字符,保存当前字符串。因为字符会重复,所以要做一个判断,如果当前位置已经固定过该字符,就不重复固定。

void helper(vector<string>&res, string str, int index) {
    if (index == str.size() - 1) {
        res.push_back(str);
    }

    set<char> record;
    for (int i = index; i < str.size(); i++) {
        if (record.count(str[i])) // 该字符在当前位置已经固定过
            continue;
        record.insert(str[i]);
        
        swap(str[i], str[index]);
        helper(res, str, index + 1);
        swap(str[i], str[index]);
    }
}

vector<string> permutation(string s) {
    vector<string> res;
    helper(res, s, 0);
    return res;
}

标签:index,38,Offer,res,排列,str,字符,字符串
From: https://www.cnblogs.com/AngleLin/p/16995820.html

相关文章

  • 力扣151 反转字符串中的单词
    题目:给你一个字符串s,请你反转字符串中单词的顺序。单词是由非空格字符组成的字符串。s中使用至少一个空格将字符串中的单词分隔开。返回单词顺序颠倒且单词......
  • 剑指 Offer 43 1~n整数中的十进制表示中1出现的次数
    剑指Offer43|1~n整数中的十进制表示中1出现的次数输入一个整数n,求1~n这n个整数的十进制表示中1出现的次数。例如,输入12,1~12这些整数中包含1的数字有1、10、11和12,1......
  • JS数组和字符串方法(API总结与应用)
    目录ArrayAPI静态方法数组首尾元素处理数组遍历(重要)数组查找数组过滤(重要)数组合并数组删除与截取数组排序StringAPI字符串查找与匹配字符串替换字符串合并字符串首尾空格......
  • 005 日期时间与字符串转换
    1.字符串转LocalDate1publicstaticLocalDateparseDateString(StringdateString,Stringpattern){2try{3DateTimeFormatterformatter=DateTime......
  • 力扣-538-把二叉搜索树转换为累加树
    intpreSum=0; voidtraversal(TreeNode*root){ if(!root)return; traversal(root->right); root->val+=preSum; preSum=root->val; traversal(roo......
  • c++ 去除字符串首尾的空白字符
    c++去除字符串首尾的空白字符​​方法一使用find_first_not_of和find_last_not_of​​​​方法二使用正则表达式(c++11)​​​​测试​​​​测试结果​​方法一使用find_f......
  • 正则提取器和beanshell处理器组合,将提取的所有id拼接成字符串
    1.添加正则表达式,提取所有id值2.添加beanshell处理器将所有的id值拼接成字符串方法一:intN=Integer.parseInt(vars.get("build_matchNr"));log.info(N.toString())......
  • 剑指 Offer II 003. 前 n 个数字二进制中 1 的个数
    题目内容给定一个非负整数n ,请计算0到n之间的每个数字的二进制表示中1的个数,并输出一个数组。说明:0<=n<=105解题思路1直接运用内置函数bin()和count()将......
  • [leetcode]第 3 天 字符串(简单)
    05.替换空格思路由于每次替换从1个字符变成3个字符,使用字符数组可方便地进行替换。classSolution{publicStringreplaceSpace(Strings){StringBuff......
  • 第38期:MySQL 时间类分区具体实现
    适用分区或者说分表最多的场景依然是针对时间字段做拆分,这节我们详细讲讲如何更好的基于时间字段来拆分。分别按照年、月、日几个维度的实现方法以及一些细节注意事项。第......