全排列c++代码_[剑指offer]34字符串排列

今天开始讲和大家坚持打卡面试非常重要算法练习---剑指offer,希望我们能一起肝。

1 题目描述

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

2 思路----java

  • 求出所有可能出现在第一个未知的字符,即把第一个字符与后面所有字符交换

  • 固定第一个字符,求后面所有字符的排列

3 代码实现

c++版本

class Solution {
public:
    vector<string> Permutation(string str) {
        if(str.empty())
            return result;
        chang(str, 0, str.size()); 
        sort(result.begin(),result.end());
        auto it = unique(result.begin(),result.end());
        result.erase(it,result.end());
        return result;

    }
    void chang(string &str,int start,int len){
        if(start == len)
            result.push_back(str);
        //
        for(int i = start; i             swap(str[start],str[i]);
            chang(str, start+1,len);
            swap(str[start],str[i]);
        }  
    }

    vector<string> result;
};

java版本

import java.util.ArrayList;
public class Solution {
    ArrayList list = new ArrayList<>();public ArrayList Permutation(String str) {
        Permutation(str.toCharArray(),0);return list;
    }public void Permutation(char[] c,int begin){if(begin==c.length-1)
        {
            list.add(new String(c));return;
        }for(int i=begin;i            if(c[begin]!=c[i]||begin==i) //判断是否有元素重复,重复就不交换位置
            {char temp = c[i];for(int j=i;j>begin;j--)  //要满足字典排序,所以挨个挪位置
                     c[j]=c[j-1];
                 c[begin]=temp;
                 Permutation(c,begin+1);   //求后面所有字符的排列
                 temp= c[begin];for(int j=begin;j                     c[j]=c[j+1];
                 c[i]=temp;
            }
        }
    }
}

python版本

# -*- coding:utf-8 -*-
class Solution:
    def Permutation(self, ss):
        # write code here
        if len(ss)<=1:
            return ss
        result = set()
        # 遍历字符串 固定第一个元素,每个元素都可以选择a,b,c然后递归
        for i in range(len(ss)):
            for j in self.Permutation(ss[:i]+ss[i+1:]):#依次固定元素,其他的全排列
                result.add(ss[i]+j)#集合添加去重(如果存在重复字符,排列后存在相同如baa)
        return sorted(result)

4 唠嗑

2020年8月4日打卡,打卡格式"打卡XX天"。暖蓝汇聚大家一起,探讨简历修改,面试经历分享,尽全力让大家能在2020找到理想的工作。如果你想加入,加我拉你进面试交流群。

a1dc84ed534bebddfe24e4c90133fc80.png

[剑指offer]20二叉树的镜像[剑指offer]19连续子数组最大和[剑指offer]2替换空格[剑指offer]3从尾到头打印链表[剑指offer]4栈实现队列[剑指offer]5斐波那契数列[剑指offer]6跳台阶[剑指offer]8二进制中1的个数炸裂!万字长文拿下HTTP
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值