菜鸟笔记
提升您的技术认知

剑指offer

《剑指offer》刷题目笔记

剑指offer 数组

《剑指offer》二维数组中的查找《剑指offer》旋转数组的最小数字《剑指offer》调整数组顺序使奇数位于偶数前面《剑指offer》数组中出现次数超过一半的数字《剑指offer》连续子数组的最大和《剑指offer》把数组排成最小的数《剑指offer》数组中的逆序对《剑指offer》数字在排序数组中出现的次数《剑指offer》数组中只出现一次的数字《剑指offer》数组中重复的数字《剑指offer》构建乘积数组

剑指offer 字符串

《剑指offer》替换空格《剑指offer》字符串的排列《剑指offer》第一个只出现一次的字符《剑指offer》左旋转字符串《剑指offer》翻转单词顺序序列《剑指offer》把字符串转换成整数《剑指offer》正则表达式匹配《剑指offer》表示数值的字符串

剑指offer 链表

《剑指offer》从尾到头打印链表《剑指offer》链表中倒数第k个结点《剑指offer》反转链表《剑指offer》合并两个排序的链表《剑指offer》复杂链表的复制《剑指offer》两个链表的第一个公共结点《剑指offer》链表中环的入口结点《剑指offer》删除链表中重复的结点

剑指offer 树

《剑指offer》重建二叉树《剑指offer》树的子结构《剑指offer》二叉树的镜像《剑指offer》从上往下打印二叉树《剑指offer》二叉树中和为某一值的路径《剑指offer》二叉树的深度《剑指offer》平衡二叉树《剑指offer》二叉树的下一个结点《剑指offer》对称的二叉树《剑指offer》按之字顺序打印二叉树《剑指offer》把二叉树打印成多行《剑指offer》序列化二叉树

《剑指offer》字符串的排列-ag真人游戏

阅读 : 121

题目描述

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

输入描述:

输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

解题思路

我们求整个字符串的排列,可以看成两步:首先求所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符交换。如下图所示:

上图就是分别把第一个字符a和后面的b、c等字符交换的情形。首先固定第一个字符,求后面所有字符的排列。这个时候我们仍把后面的所有字符分为两部分:后面的字符的第一个字符,以及这个字符之后的所有字符。然后把第一个字符逐一和它后面的字符交换。

这个思路,是典型的递归思路。

代码实现(c )

class solution {
public:
    vector permutation(string str) {
        //判断输入
        if(str.length() == 0){
            return result;
        }
        permutationcore(str, 0);
        //对结果进行排序
        sort(result.begin(), result.end());
        return result;
    }
private:
    void permutationcore(string str, int begin){
        //递归结束的条件:第一位和最后一位交换完成
        if(begin == str.length()){
            result.push_back(str);
            return;
        }
        for(int i = begin; i < str.length(); i  ){
            //如果字符串相同,则不交换
            if(i != begin && str[i] == str[begin]){
                continue;
            }
            //位置交换
            swap(str[begin], str[i]);
            //递归调用,前面begin 1的位置不变,后面的字符串全排列
            permutationcore(str, begin   1);
        }
    }
    vector result;
};

代码实现(python)

# -*- coding:utf-8 -*-
class solution:
    def permutation(self, ss):
        if len(ss) <=0:
            return []
        res = list()
        self.perm(ss,res,'')
        uniq = list(set(res))
        return sorted(uniq)
    def perm(self,ss,res,path):
        if ss=='':
            res.append(path)
        else:
            for i in range(len(ss)):
                self.perm(ss[:i] ss[i 1:],res,path ss[i])
网站地图