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;
                }
            }
        }
    };
  • 相关阅读:
    jsp中一个标签两种方式绑定两个click事件导致未执行的问题
    Chrome浏览器自动填充<input>标签的密码
    js中字符串的replace方法区分单双引号
    注册页面-省市联动
    mac OS X下制定ll指令
    ssh通过密钥免密登录linux服务器
    mac OS X下PhpStorm+MAMP PRO+Xdebug+FireFox集成开发和断点调试环境配置
    ubuntn配置桌面快捷方式
    centos安装Redis
    Spring文件下载与上传 FormData
  • 原文地址:https://www.cnblogs.com/fancy-li/p/11724890.html
Copyright © 2011-2022 走看看