• 剑指offer 28:字符串的排列


    题目描述

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

    输入描述

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

    解题思路

    本题解题思路与存在重复数字的数组的全排列思路相同。需要完成排列去重的工作。因而工作分为两步。第一,确定当前数组元素的全排列;第二,对排列结果去重。

    1.无论对于数组还是字符串,使用递归实现全排列的过程最容易,对于一个字符串而言,他的所有全排列可视为由第一个字符与剩余所有字符全排列的连接。而对于剩余字符,又可视为剩余字符中第一个字符,与其他剩余字符全排列的连接,依次递归。

    2.对于去重,使用哈希地址映射,快速去重,简单讲就是使用set数据类型存储得到的所有全排列,最终set集合中得到的就是去重后的结果。

    C++代码实现

    class Solution {
    public:
        vector<string> Permutation(string str) {
            vector<string> result;
            int sz=str.size();
            if(sz==0){
                  return result;
              }
            Permutation_sub(str,0,result);
            set<string> st(result.begin(), result.end());
            result.assign(st.begin(), st.end());
            return result;
        }
        void Permutation_sub(string &str, int begin, vector<string> &strlist){
            int sz=str.size();
            if(begin==(sz-1)){
                strlist.push_back(string(str));
            }
            else{
                for(int pos=begin;pos<sz;pos++){
                    char tmp=str[pos];
                    str[pos]=str[begin];
                    str[begin]=tmp;
                    Permutation_sub(str,begin+1,strlist);
                    tmp=str[pos];
                    str[pos]=str[begin];
                    str[begin]=tmp;
                }
            }
        }
    };
  • 相关阅读:
    Effective C++学习笔记之explicit
    腾讯面试经验2
    腾讯面试经验
    值类型和引用类型的区别,struct和class的区别
    【转载】固态硬盘的S.M.A.R.T详解
    SSD的传输总线、传输协议、传输接口
    坏块管理(Bad Block Management,BBM)
    脱离SVN的控制
    Func的介绍
    简单AOP
  • 原文地址:https://www.cnblogs.com/fancy-li/p/11724890.html
Copyright © 2020-2023  润新知