题目描述

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

输入描述:

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

这道题我最开始的想法是递归,每次处理一个字符,然后将其存在一个字符串里面,当字符串到了指定的长度,就把它放在一个vector里面,就可以了。但是问题来了,字符可以重复,这句话很关键。如果单纯的进行处理,最后会造成大量重复的字符串结果。我的想法是写一个判断是否重复的函数,当这个字符串重复的时候,就不压入vector了。递归的时候要注意回溯,代码如下:

class Solution {
public:vector<string> vec;vector<string> Permutation(string str) {if(str.size()<=0) return vec;vector<bool> visit(str.size(),false);//记录某个字符是不是已经被使用过vector<char> rec;dfs(str,visit,0,rec);return vec;}void dfs(string str, vector<bool> &visit, int length, vector<char> &rec){if(length >= str.size()){string tmpstr = "";for(int i = 0;i<rec.size();i++) tmpstr += rec[i];if(!findDup(vec, tmpstr)) vec.push_back(tmpstr);//看这个字符串之前是不是出现return;}for(int i = 0;i<str.size();i++){if(!visit[i]){visit[i] = true;rec.push_back(str[i]);dfs(str,visit,length+1,rec);visit[i] = false;//注意递归时候的回溯rec.pop_back();}}}bool findDup(vector<string> &vec, string tmpstr){//判断这个字符串是不是重复过for(int i = 0 ;i< vec.size();i++){if(tmpstr == vec[i]) return true;}return false;}
};

我一直觉得我这个办法不是很好,今天想到了一个更好地办法,字符交换。这样通过一个简单的判断就能避免重复的字符造成重复字符串的结果。

首先上代码:

class Solution {
public:vector<string> vec;vector<string> Permutation(string str) {if(str.size()<=0) return vec;helper(str,0);sort(vec.begin(), vec.end());return vec;}void helper(string &str, int i){if(i>= str.size()){vec.push_back(str);return;}for(int j = i;j<str.size();j++){if(j==i || str[j]!=str[i]){swap(str[i], str[j]);helper(str,i+1);swap(str[i],str[j]);}}}};

我们来看以下这个helper函数。它的思想是用递归,每次交换两个元素。从一个整体的角度来说,求一个字符串的全排列,就是在前面一定长度的字符串长度固定的情况下,任意交换后面字符串的两个元素,最后形成总的字符串全排列。然后helper里面的循环,为什么j要从i开始而不是i+1开始呢?这是因为如果j从i+1开始,那么在for循环里面根本不会进入边界条件。换句话说,比如说“abc”这个序列,我们首先就要把这个序列自己输出,然后再考虑其他的序列组合,而j=i开始循环能保证原封不动的输出。

而str[j]!=str[i]的条件则能避免string中出现两个相同的字符造成的重复,这是因为全排列是两个任意字符交换形成的结果,那么字符一样自然就不需要交换了。

牛客网 字符串的排列相关推荐

  1. 牛客网 字符串通配符

    做题链接:字符串通配符__牛客网 (nowcoder.com) 要求:实现如下2个通配符(不区分大小写): *   :匹配0个或以上的字符(注:能被*和?匹配的字符仅由英文字母和数字0到9组成,下同) ...

  2. 牛客网——字符串逆序

    牛客-字符串倒置 题目链接 解题思路 指针解法 题目链接 链接: link 这个是倒置字符串题目的链接,有兴趣做的小伙伴可以点击前往 解题思路 思维方式: 下面我们将逐步进行对问题的分析: 1.我们可 ...

  3. 牛客网--字符串合并处理(Java)

    按照指定规则对输入的字符串进行处理. 详细描述: 将输入的两个字符串合并. 对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序.这里的下标意思是字符在字符串中的位置. ...

  4. 牛客网在线编程专题《剑指offer-面试题28》字符串的排列

    我的个人微信公众号:Microstrong 微信公众号ID:MicrostrongAI 公众号介绍:Microstrong(小强)同学主要研究机器学习.深度学习.计算机视觉.智能对话系统相关内容,分享 ...

  5. 牛客网错题集合之字符串(一)

    [不定项选择题] 已知一段文本有1382个字符,使用了1382个字节进行存储,这段文本全部是由a.b.c.d.e这5个字符组成,a出现了354次,b出现了483次,c出现了227次,d出现了96次,e ...

  6. 牛客网暑期ACM多校训练营(第三场) E Sort String 哈希处理字符串(模板)

    链接:https://www.nowcoder.com/acm/contest/141/E 来源:牛客网 Eddy likes to play with string which is a seque ...

  7. 牛客网–华为机试在线训练4:字符串分隔

    牛客网–华为机试在线训练4:字符串分隔 题目描述 •连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组: •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理. 输入描述: 连续输 ...

  8. 牛客网--华为机试在线训练1:字符串最后一个单词的长度

    牛客网–华为机试在线训练1:字符串最后一个单词的长度 题目地址: https://www.nowcoder.com/practice/8c949ea5f36f422594b306a2300315da? ...

  9. 方格走法-牛客网(排列组合和动态规划)

    方格走法-牛客网 题目描述 有一个X*Y的网格,小团要在此网格上从左上角到右下角,只能走格点且只能向右或向下走.请设计一个算法,计算小团有多少种走法.给定两个正整数int x,int y,请返回小团的 ...

最新文章

  1. 自动类型转换和强制类型转换
  2. android列表勾选框,android listview实现复选框列表
  3. php kint调试,PHP调试助手
  4. #技术分享# “乐高”内核的诞生
  5. Python 内建函数
  6. php mail 失败,php-mail()失败,但返回true
  7. java无法实例化类型_java – 无法实例化泛型中的类型
  8. Spring集成Thrift--Server AND Client
  9. 2017年中国大功率UPS市场需求、市场需求及市场结构占比分析预测
  10. JAVA 多线程学习总结
  11. Java接口中的成员变量为什么必须声明为public static final?
  12. java 日期calendar_Java中用Calendar类计算周和周的起始日期(转)
  13. 3.Event Loop
  14. php fprintf,PHP fprintf() 函数 - PHP 教程 - 菜鸟学堂-脚本之家
  15. 【十次方】十次方项目前期准备
  16. 2022年最新餐饮外卖行业市场研报合集(共45份)
  17. 打开html文件很卡,网页打开很慢是什么原因【解决办法】
  18. Python编程学习笔记 - 下载数据进行可视化(I)
  19. 加泰罗尼亚理工大学 计算机 排名,加泰罗尼亚理工大学排名
  20. 资源-Windows10-2020原版镜像下载地址(20H2)以及1809、1803、1709

热门文章

  1. 零基础适合学python吗-零基础更适合学习Java还是python?
  2. 零基础学python书籍-5本好书------Python零基础到入门必读Python书籍!
  3. python培训价目表-参加python培训要多少钱?
  4. python 代码命令大全-Linux命令大全
  5. python编程是啥-什么是Python
  6. 几行代码就搞定一个文字识别功能,同时还能转换成语音,畅快!
  7. 本地离线语音识别芯片厂家盘点,哪一家实力更强
  8. 解析深度学习:语音识别实践 (俞栋等著) 完整pdf[44MB]
  9. python数字保留两位_Python 鲜为人知的数值格式化
  10. python接口自动化参数化_python接口自动化-参数化