字符串全排列算法_C#版_剑指OFFER
字符串全排列算法_C#版_剑指OFFER
题目描述
题目描述
输入一个长度为 n 字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组。
例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。
数据范围: n < 10n<10
要求: 空间复杂度 O(n!)O(n!),时间复杂度 O(n!)O(n!)
输入描述: 输入一个字符串,长度不超过10,字符只包括大小写字母。
思路
显然此题为递归思维。固定一个字符,依次与剩下的字符进行交换,然后固定下一个,思想类似于排列…
首先,将字符串分为两个部分,一部分为用于交换的固定串,一部分为等待交换的交换串。为方便讲解,将固定串中字符称为固定字符,交换串中的字符称为交换字符。
那么其递归顺序是这样的:
- 固定第一个字符,与剩下交换串substr依次交换
- 将substr视做第一个字符串,固定substr的第一个字符,进行操作1,直到substr长度为0,结束递归
- 第一个固定字符使用完毕,开始固定第二个字符,与剩下的字符串substr依次交换字符值
- 重复上述步骤,直至所有字符都固定过
此时,会有重复字符串的问题。固定字符与交换字符相同,那就白交换了。这时可以设置不相同时才交换。
但还是会有重复问题:
比如a b1 b2,
按照思路,
第一轮
固定a
交换一次后,得到b1 a b2,substr (a,b2 ) 交换后得到b1 b2 a,(第二步)
a b1 b2交换第二次,得到b2 b1 a,此时就重复了
此时发生重复问题是因为进入递归后,substr可当做一个独立字符串,前面的固定字符串无法影响substr产生的交换字符串,显而易见地,substr字符串拥有的字母与数量相同,则会产生重复的排列。
为了解决这个问题,就提前掐断字母全都相同的substr。
判断当前交换字符,与固定字符之间的串(称为中间串)是否有与其重复的字符,如果有,就取消交换。
比如a b1 c b2 d,
按照思路,
第一轮固定a,
交换第一次得到,b1 a c b2 ,
substr (a,c,b2 ) 总会得到交换串 b2,c,a
而a与b2交换后得b2 b1 c a ,此字符串进入递归后substr(b1,c,a) 肯定会产生重复排列
using System.Collections.Generic;
using System;
class Solution
{public List<string> Permutation(string str){// write code hereList<string> res = new List<string>();if(str.Length==0)return res;recursion(0,str,ref res);return res;}public void recursion(int fixedIdx,string str,ref List<string> res){// write code here//注意 string是不可修改的,故要转换为字符串数组char [] newstr = str.ToCharArray();res.Add(str); //添加初始串int curIdx;while(fixedIdx<str.Length){ //固定字符依次向前推进for(curIdx=fixedIdx+1;curIdx<str.Length;curIdx++){if(is_swap(fixedIdx,curIdx,newstr)){swap(fixedIdx,curIdx,ref newstr); //交换recursion(fixedIdx+1,new string(newstr),ref res); //从此串确定的位置后一位开始递归newstr=str.ToCharArray(); //复原}}fixedIdx++;}}//防止与前面会产生的交换串重复, 递归字符串拥有的字母与数量相同,则会输出重复的排列//保证相似的字符串只会输出一次public bool is_swap(int fixedIdx,int curIdx,char[] newstr){int idx=curIdx-1; //依次比较中间串是否有相等字符,若有返回false,跳过这轮交换while(idx>=fixedIdx){if(newstr[idx]==newstr[curIdx])return false;idx--;}return true;}//交换public void swap(int fixedIdx,int idx,ref char[] substr){char tmp=substr[fixedIdx];substr[fixedIdx]=substr[idx];substr[idx]=tmp;}
}
字符串全排列算法_C#版_剑指OFFER相关推荐
- 剑指offer有用python版的吗_Python算法面试通关,剑指offer就靠它了
原标题:Python算法面试通关,剑指offer就靠它了 北上广容不下肉身, 三四线放不下灵魂, 程序员里没有穷人, 有一种土豪叫算法工程师. 算法,晦涩难懂,却又是IT领域最受重视的素养之一可以说, ...
- java queue 最大值_[剑指offer题解]队列的最大值/滑动窗口的最大值
前言 众所周知,<剑指offer>是一本"好书". 为什么这么说? 因为在技术面试中,它里面罗列的算法题在面试中出现的频率是非常非常高的. 有多高,以我目前不多的面试来 ...
- java统计一个字符串中每个字符出现的次数_剑指offer算法题054:字符流中第一个不重复的字符...
推荐阅读:宇宙条的工作总结:一年前还在面试找工作,一年后在面试找工作的学弟学妹们:第一次当面试官的经历分享小编在求职找找工作期间剑指offer上的算法题刷了很多遍,并且每道题小编当时都总结了一种最适合 ...
- ++递归 字符串全排列_剑指 Offer 38. 字符串的排列
剑指 Offer 38. 字符串的排列 输入一个字符串,打印出该字符串中字符的所有排列. 你可以以任意顺序返回这个字符串数组,但里面不能有重复元素. 示例: 输入:s = "abc" ...
- 道指mt4代码_剑指offer算法题052:正则表达式匹配
小编在求职找找工作期间剑指offer上的算法题刷了很多遍,并且每道题小编当时都总结了一种最适合面试时手撕算法的最优解法.考虑到剑指offer算法题在面试中的高频出现,小编每天和大家分享一道剑指offe ...
- 在要求输入数字处找到非数字字符_剑指 Offer 67. 把字符串转换成整数 leetcode 剑指offer系列...
点击专辑上方"蓝字"关注我吧 题目难度: 中等 原题链接[1] 今天继续更新剑指 offer 系列, 老样子晚上 6 点 45 分准时更新公众号 每日精选算法题, 大家记得关注哦~ ...
- 剑指offer有python版吗_剑指Offer算法类题目[Python版]
标签:重复 作用 coding 面试 medium mba none fas utf-8 面试题012 数值的整数次方 解题思路1 考虑所有情况,循环连乘 代码: de ...
- 剑指offer最新版_剑指Offer——Java版本(持续更新)
0 前言 邻近校招,算法要命!!! 本文为研究剑指Offer过程中的笔记,整理出主要思路以及Java版本题解,以便记忆和复习. 参考整理来自<剑指Offer 第二版>. 特别注意,对每道题 ...
- leetcode 打印_剑指 Offer 总结 - leetcode 剑指offer系列
剑指 Offer 系列完结撒花!! 本篇文章是对整个系列的精华总结, 对系列的每篇文章进行了分类, 并用一句话概括每道题的思路, 方便大家理解和记忆, 当然也包含原文完整链接供大家参考 总的来说, 写 ...
最新文章
- VS2010安装OpenGL
- c++和c语言中的函数相互调用的问题
- c语言筛选法_极少数人用过的另类素数求解法,C语言经典算法之筛选法求质数...
- 傅里叶变换(待总结)
- Android中添加背景音乐的两种方法
- [html] 你认为Html的术难点在哪?
- 多个pdf合并成一个pdf_手机里多个PDF合并成一个PDF的免费方法
- Windows Server 2008搭建单域环境
- Linux学习笔记(详细)
- RS-485接口详解
- 梦幻西游脚本开发教学
- 计算机与人脑的优势与缺点,科学网—《计算机与人脑》笔记 - 王龙飞的博文
- OC10_数组的内存管理
- 华为手机获取hci日志
- SpringBoot + 阿里云 OSS 实现在线视频播放
- 银联API | 银行卡信息查询 信息安全获取
- 使用lodop实现web精确套打
- Linux文件系统层级标准fhs,文件系统层次标准(FHS)简介
- 服务器连接文件,连接服务器文件
- 逆变器simulink模型——处理器在环测试(PIL)