zoukankan      html  css  js  c++  java
  • 剑指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;
                }
            }
        }
    };
  • 相关阅读:
    MTLLoader 报 Handlers.get() has been removed. Use LoadingManager.getHandler() instead 错误处理
    uniCloud云开发已实现五端上线【言语录书】
    v-model 双向绑定 vue3.x
    javascript 集合操作
    链表操作
    vue3 父子组件双向数据绑定
    二叉树排序
    自制Chrome扩展插件:用于重定向js
    解析Markdown文件生成React组件文档
    微前端框架single-spa初探
  • 原文地址:https://www.cnblogs.com/fancy-li/p/11724890.html
Copyright © 2011-2022 走看看