《剑指offer》字符串的排列

一、题目描述

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

二、输入描述

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

三、输出描述

所能排列出来的所有字符串。结果请按字母顺序输出

四、牛客网提供的框架

class Solution {
public:
    vector<string> Permutation(string str) {

    }
};

五、解题思路

1、逐个字符插入,生成新的字符串
2、去掉相同的字符串
3、排序

对于步骤1、2:
例如:“abcc”逐个字符处理
vector vt
1)“a”进入vt
2)“b”跟vt中所有字符串组成新的字符串(“b”插入以前字符串不同的位置),”a”出列表,“b”插入“a”的不同位置得到的新字符串有:
“ab”,”ba”,都进入vt中()
3)对vt中的字符串检查是否有相同的字符串(没有)
4)“c”跟vt中所有字符串组成新的字符串:
“abc”,”acb”,”cab”;”bac”,”bca”,”cba”先后进入vt中。
5)对vt去重
6)“c”跟vt中所有字符串组成新的字符串:
“abcc”,”abcc”,”acbc”,”cabc”;
“acbc”,”accb”,”accb”,”cacb”;
“cabc”,”cacb”,”ccab”,”ccab”;
“bacc”,”bacc”,”bcac”,”cbac”;
“bcac”,”bcca”,”bcca”,”cbca”;
“cbac”,”cbca”,”ccba”,”ccba”;
进入vt中。
7)对vt去重、排序:
abcc
acbc
accb
bacc
bcac
bcca
cabc
cacb
cbac
cbca
ccab
ccba

六、代码

#include<iostream>
#include<vector>
#include<string>
#include<queue>

using namespace std;

class Solution {
public:
    vector<string> Permutation(string str) {
        vector<string> vt;

        int leng = str.size();
        if(leng <= 0) return vt;
        string temp = "";
        temp += str[0];

        vt.push_back(temp);


        for(int i = 1; i < leng; i++)
        {
            string s = "";
            s += str[i];
            vector<string> tempQu;

            while(vt.size()>0)  //逐个字符插入
            {
                temp = vt.back();
                for(int index = 0; index <= temp.size(); index++)   //向字符串temp中各个位置插入s,生成不同的字符串
                {
                    string newStr = temp.substr(0, index);  //使用拼接的方法
                    newStr += s;
                    newStr += temp.substr(index, temp.size()-index);
                    tempQu.push_back(newStr);
                }
                vt.pop_back();
            }

            /*
            *去掉vector中相同的字符串
            */
            vt.clear();
            for(int j = 0; j < tempQu.size(); j++)
            {
                string currStr = tempQu[j];
                int k;
                for(k = 0; k < vt.size(); k++)
                {
                    if(vt[k] == currStr) break;
                }
                if(k >= vt.size()) vt.push_back(currStr);
            }

        }
        vt = sortStr(vt);
        return vt;
    }


    /*
    *插入排序
    */
    vector<string> sortStr(vector<string> str)
    {
        for(int i = 1; i < str.size(); i++)
        {
            string temp = str[i];
            int j = i - 1;
            while(j >= 0 && str[j] > temp)
            {
                str[j+1] = str[j];
                j--;
            }
            str[j+1] = temp;
        }
        return str;
    }

};
<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值