剑指offer学习笔记(12)--字符串的排列

考点:回溯、字符串、全排列、递归

知识点

1.string

string类提供了一系列针对字符串的操作,比如:

  • 1.size()和length()--返回string对象的字符个数,他们执行效果相同
  • 2.push_back() --尾插一个字符
  •  3.insert()-- 插入字符,insert(pos,char):在制定的位置pos前插入字符char
  • 4.append()--拼接字符串,在字符串的末尾添加字符
  • 5.sort(s.begin(),s.end())-- string的排序
  • 6.find() -- 在字符串中查找字符串
  • 7.replace() -- 替换字符串 ,string &replace(int p, int n,const char *s); //删除从p开始的n个字符,然后在p处插入串s
  • 8.substr() -- 返回某个子字符串,string substr(int pos = 0,int n = npos) const; //返回pos开始的n个字符组成的字符串
  • 9.string &erase(int p, int n);//删除p开始的n个字符,返回修改后的字符串
  • 10.void swap(string &s2); //交换当前字符串与s2的值

参考链接https://blog.csdn.net/qq_37941471/article/details/82107077

2.vector函数

题目描述

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

分析思路

将字符串分两部分。第一部分是它的第一个字符,第二部分是后面所有字符。

第一步求所有可能出现在第一个位置的字符,即把第一个字符和后面所有字符交换。如图(a)将字符串分两部分,(b)拿第一个字符和他后面字符逐个交换。

第二步,固定第一个字符,求后面所有字符全排列(仍然将后面字符分两部分,排列求法同第一步)。此处实现应用递归,应用回溯算法思想。

实现代码

class Solution {
public:
    vector<string> result;
    vector<string> Permutation(string str) {
        if(str.length()==0)
            return result;
        Permutation1(str,0);
        sort(result.begin(),result.end());
        return result;
    }
    void Permutation1(string str,int begin){
        //递归结束的条件:索引到达最后一个元素
        if(begin==str.length()-1)  
        {
            result.push_back(str);
            return;
        }
        for(int i=begin;i<str.length();i++){
            //如果字符串相同,则不交换
            if(i!=begin && str[i]==str[begin]){
                continue;
            }
            // 第一次循环i与begin相等,相当于第一个位置自身交换,关键在于之后的循环,
            // 之后i!= begin,则会交换两个不同位置上的字符,直到begin==str.size()-1,进行输出
            swap(str[i],str[begin]);   //后面依次与第一个begin交换
            Permutation1(str,begin+1);  //递归调用,前面begin+1的位置不变,后面字符依次全排列
            swap(str[i],str[begin]);  
        }
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值