zoukankan      html  css  js  c++  java
  • 剑指offer-字符串的排列

    描述

    输入一个字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

    输入描述:

    输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
     
    求解思路:
    1. 首先遇到重复问题,首先想到通过集合,以尝试解决字符重复的问题,简化问题。
    2. 然后就是比较简单的递归了:
      • 确定递归函数功能(有点类似DP中确定状态,不过一个是结果,一个是动作):返回第第 个字符字符到最后一个字符的全排列。
      • 确定出口和逻辑处理(可先画递归树结构寻找规律)。
    代码:
     1 #include<iostream>
     2 using namespace std;
     3 #include<queue>
     4 #include<vector>
     5 #include<string>
     6 #include<set>
     7 
     8 class Solution {
     9 public:
    10     //  通过集合解决重复的问题,简化问题
    11     // 然后就是一个很简单的递归了。
    12     vector<string> Permutation(string str) {
    13         // 将集合转换为vector
    14         vector<string> st;
    15         if(str.empty()){
    16             return st;
    17         }
    18         set<string> se=permaute(str);
    19         set<string>::iterator ite=se.begin();
    20         
    21         for(;ite!=se.end();++ite){
    22             st.push_back(*ite);
    23         }
    24         return st;
    25     }
    26     
    27     // 每次递归,弄一个集合,然后返回上层递归时,将集合和当前字符组合
    28     set<string> permaute(string remain){
    29         set<string> curSet;
    30         int len=remain.size();
    31         if(len==1){
    32             curSet.insert(remain);
    33             return curSet;
    34         } 
    35         for(int i=0;i<len;++i){  
    36             // 更新下一层的remain
    37             string br=remain;
    38             string::iterator ite=br.begin();
    39             std::advance(ite,i);  // 向后移动i个位置
    40             br.erase(ite);
    41             // int a=1;
    42             set<string> belowSet=permaute(br);
    43             // 组合下一层的集合
    44             set<string>::iterator site=belowSet.begin();
    45             while(!belowSet.empty() && site!=belowSet.end()){
    46                 curSet.insert(remain[i]+*site);
    47                 ++site;    
    48             }   
    49         }
    50         return curSet;
    51     }
    52 };
    53 
    54 int main() {
    55     Solution* sol = new Solution();
    56     string remain="ab";
    57     vector<string> vs=sol->Permutation(remain);
    58     vector<string>::iterator ite=vs.begin();
    59     for(;ite!=vs.end();++ite){
    60         string el=*ite;
    61         for(int i=0;i<el.size();++i){
    62             cout<<el[i];
    63         } 
    64         cout<<endl;
    65     }
    66     return 0;
    67 }
     
    心之所愿,永不相忘
  • 相关阅读:
    【Kafka】《Kafka权威指南》——从Kafka读取数据
    【Kafka】《Kafka权威指南》——分区partition
    【Kafka】《Kafka权威指南》——写数据
    【Kafka】《Kafka权威指南》入门
    六大设计原则
    EXCEPTION_ACCESS_VIOLATION(0xc0000005)
    属性文件——Java&Spring
    Maven——向Maven本地仓库中手动添加依赖包(ps:ojdbc.jar)
    使用Python轻松批量压缩图片
    Nginx常用命令,解决你日常运维的烦恼
  • 原文地址:https://www.cnblogs.com/zgll/p/15070454.html
Copyright © 2011-2022 走看看