剑指offer之字符串的全排列

1 问题

求字符串的全排列,比如字符串abc,它的全排列如下

abc, acb, bac, bca, cad, cba

 

 

 

 

 

 

2 思路

我们先固定第一个字符,这里的第一个字符肯定是这个字符串里面字符串的全子集(不包含重复),abc字符串,我们a和a交换,这里也就是固定a字符的,然后我们只需要求出后面bc字符的全排列,这个时候我们可以用递归,我们依然b和b进行交换,c和c进行交换,到了末尾我们递归就结束,记得return.我们可以得出bc全排列的一种既bc,然后我们b和c需要交换位置,变成了cb,然后我们b和b进行了一次交换,然后我们可以得到bc全排列的一种既cb,所以固定a字符,我们可以得到全排列字符串abc acb,所以依次类推,我们可以固定b字符和c字符求出所以字符串的全排列

 

 

 

 

 

3 代码实现

c++版本

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>using namespace std;class Permutation{
private:void permutation(string str, int begin);
public:vector<string> permutation(string str);vector<string> result;
};vector<string> Permutation::permutation(string str)
{if (str.length() == 0){return result;}permutation(str, 0);sort(result.begin(), result.end());   return result;
}void Permutation::permutation(string str, int begin)
{if (begin == str.length()){result.push_back(str);return;}for (int i = begin; i < str.length(); ++i){if (i != begin && str[i] == str[begin])continue;//这里开始交换第一个元素和后面的元素,也就是起到固定的作用swap(str[begin], str[i]);//递归后面的子字符串permutation(str, begin + 1);//交换了要记得还原swap(str[i], str[begin]);}
} int main()
{Permutation h;h.permutation("abc");vector<string> result = h.result;for(int i = 0; i < result.size(); ++i){std::cout << result[i] << std::endl;	}return 0;
}

c版本

#include <stdio.h>void permutation(char *str);
void permutation_core(char *str, char *begin);void permutation(char *str)
{if (str == NULL) {printf("str is NULL\n");return;}permutation_core(str, str);
}void permutation_core(char *str, char *begin)
{if (*begin == '\0'){printf("%s\n", str);}else{for (char *ch = begin; *ch != '\0'; ++ch){char temp = *ch;*ch = *begin;*begin = temp;permutation_core(str, begin + 1);temp = *ch;*ch = *begin;*begin = temp; }} 
}
int main()
{//这里不能用char *str = "adc",因为我们需要交换字符串里面的字符,需要操作栈内存char str[] = "abc";  permutation(str);return 0;
}

这样写,如果有重复的字符就有问题,比如ada,我们优化如下,去掉重

#include <stdio.h>
#include <string.h>void permutation(char *str);
void swap(char *str, int start, int end);
void permutation_core(char *str, int begin, int end);void permutation(char *str)
{if (str == NULL) {printf("str is NULL\n");return;}int len = strlen(str);printf("len is %d\n", len);permutation_core(str, 0, len);
}void permutation_core(char *str, int begin, int end)
{if (begin == end){printf("%s\n", str);}else{for (int i = begin; i < end; ++i) {if (i != begin && str[i] == str[begin])continue;swap(str, i, begin);permutation_core(str, begin + 1, end);	swap(str, i, begin);}}}void swap(char str[], int start, int end)
{char ch = str[start];str[start] = str[end];str[end] =  ch;
}int main()
{//这里不能用char *str = "adc",因为我们需要交换字符串里面的字符,需要操作栈内存char str[] = "abc";  permutation(str);return 0;
}

 

 

 

4 运行结果

c++版本运行结果

abc
acb
bac
bca
cab
cba

c版本运行结果

abc
acb
bac
bca
cba
cab

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288374.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OC基础学习

1.OC简介 ➢ C语言的基础上&#xff0c;增加了一层最小的面向对象语法 ➢ 完全兼容C语言 ➢ 可以在OC代码中混入C语言代码&#xff0c;甚至是C代码 ➢ 可以使用OC开发Mac OS X平台和iOS平台的应用程序 2.OC关键字 ➢ 基本上所有关键字都是以开头 ➢ 下面列举一些常见的关键字&a…

关中断是否禁止任务调度?关中断能作为互斥吗?

本文引自链接http://www.52rd.com/Blog/Detail_RD.Blog_imjacob_16830.html?WebShieldDRSessionVerifyCOR6tnpfsOXExxEAO6Z6 今天再看《嵌入式软件系统教程》&#xff08;&#xff08;美&#xff09;西蒙 著&#xff0c;陈向群 等译&#xff09; &#xff0c;里面讲到关中断会…

solidity编写eth智能合约之contract 创建合约(二)

环境说明&#xff1a; Ide&#xff1a;在线remix Solidity IDE 语言&#xff1a;solidity solidity 版本号&#xff1a;0.4.20 Tip&#xff1a;如果一点都不懂的建议从头开始看 运行结果截图我不赘述&#xff0c;所有合约代码均通过个人检测。请按照标准进行操作&#xff0c;如…

为什么HttpContextAccessor要这么设计?

前言周五在群里面有小伙伴问&#xff0c;ASP.NET Core这个HttpContextAccessor为什么改成了这个样子&#xff1f;在印象中&#xff0c;这已经是第三次遇到有小伙伴问这个问题了&#xff0c;特意来写一篇记录&#xff0c;来回答一下这个问题。聊一聊历史关于HttpContext其实我们…

AJAX与SQL Server(一)

本实例演示利用Ajax技术,通过asp文件,从SQL Server数据库中读取数据。 1、新建一个网站。 2、在网站目录下新建一个txt文档,改名为datasource.asp,内容为: <%@Language="vbscript" Codepage="65001"%> <% response.expires=-1 sql="…

元素周期表排列的规律_中考化学:金属活动性顺序表和元素周期表规律总结

在我们初三学年的化学学习中&#xff0c;有两大重要规律需要同学们牢牢记住&#xff0c;这也是贯穿我们化学始终的化学规律&#xff0c;那就是金属活动性顺序表和化学元素周期表规律。一、金属活动性顺序表:金属活动性顺序由强至弱: K Ca na Mg Al Zn Fe Sn Pb(H)Cu Hg Ag Pt A…

基于c语言单片机秒表课程设计,基于c语言单片机秒表课程设计要点.doc

课程设计报告课程名称&#xff1a;单片机原理及应用报告题目&#xff1a;秒表学生姓名&#xff1a;所在学院&#xff1a;信息科学与工程学院专业班级&#xff1a;学生学号&#xff1a;指导教师&#xff1a;2013 年 12 月 25 日课程设计任务书报告题目秒表完成时间学生姓名专业班…

com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input

作者原创&#xff0c;转载请注明转载地址 第一次遇到该异常&#xff0c;在网上搜了很长时间也没找到解决答案&#xff0c;特此记录 1.异常展示&#xff1a; com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input at [Source: java.io.…

linux shell之cut命令

1 cut简单介绍 我们一般用的就是获取文本一行的的第几个到第几个字符 2 常见使用 1) cut -c start-end file 这里就是获取start到end之间的字符 比如我们这里有文本1.txt cat 1.txt chenyu cut -c 1-3 1.txt che 2) cut -c start file 这里的start就是第start个字符&…

solidity modifier函数修改器 智能合约开发知识浅学(三)

环境说明&#xff1a; Ide&#xff1a;在线remix Solidity IDE 语言&#xff1a;solidity solidity 版本号&#xff1a;0.4.20 Tip&#xff1a;如果一点都不懂的建议从头开始看 运行结果截图我不赘述&#xff0c;所有合约代码均通过个人检测。请按照标准进行操作&#xff0c;如…

汇编语言学习——完整版

简介 我为什么要学汇编 因为想在寒假手写一下操作系统玩玩&#xff0c;所以提前学一学汇编&#xff0c;到时候放假就可以直接上手写了。 什么是汇编语言 由于处理器只能理解机器语言指令&#xff0c;即 0 和 1 组成的字符串。然而&#xff0c;机器语言对软件开发来说过于晦…

百度网盘超级会员,年卡低至198元!百度官方直充,会员实时生效!

大家都喜欢用百度网盘来存储文件、照片&#xff0c;还用百度网盘分享文档&#xff0c;但没有会员的&#xff0c;容量就太小&#xff0c;传输速度也受限&#xff0c;还是咬牙充个会员吧&#xff01;幻海优品是一家正规的会员充值平台&#xff0c;价格很实惠&#xff01;百度网盘…

C#服务器编程:WebService、Ajax与回调函数(一)

目 录 1、结果展示 2、WebService 3、回调函数 本实例演示借助WebService、Ajax技术和回调函数,从MSSQL数据库中获取所需数据,并用JavaScript语言将数据结果显示到网页地图上。 1、结果展示 2、WebService (1)在工具箱的Ajax Extentions下面找到ScriptManager控件,拖…

SyntaxHighlighter行号显示错误问题解决方案

SyntaxHighlighter是根据代码中的换行符分配行号的。但是&#xff0c;如果一行代码或者注释比较长&#xff0c;在页面显示时需要分成多行显示&#xff0c;会出现行号对不上的问题&#xff0c;像这样&#xff1a; 通过设置CSS强制不换行&#xff0c;可以保证行号显示正常&#x…

mysql 一对多 关联一条最新的数据_不得不会的mysql锁

6. 多表之间的关系如图&#xff0c;实际业务数据库中的表之间都是有关系的&#xff0c;我们接下来主要要学习的就是如何分析表关系及建立表关系。分类表create table category( cid varchar(32) primary key, cname varchar(100) );商品表create table product( pid varchar(3…

[鉴权/授权].Net6下Jwt与RefreshToken的结合

微信公众号&#xff1a;趣编程ACE关注可了解.NET日常开发技巧。如需源码&#xff0c;请公众号留言 源码;上文回顾【鉴权/授权】一步一步实现一个简易JWT鉴权【鉴权/授权】自定义一个身份认证Handler【鉴权/授权】基于角色的简单授权认证如何基于JWT实现RefreshToken在前面的几篇…

C#访问postgresql数据库类MyPostDB的实现

为了访问PostgreSQL数据库&#xff0c;需要从pgfoundry网站&#xff0c;下载Npgsql .Net Data Provider for Postgresql的组件。 访问 URL&#xff1a;http://pgfoundry.org/frs/?group_id1000140&#xff0c;请按照自己的VS及.NET版本下载相应的版本。下载后解压缩zip文件&am…

单链表Java实现

近期在复习基本数据结构&#xff0c;本文是单链表的Java实现&#xff0c;包含对单链表的实现插入删除查找遍历等。最后还实现了单链表的逆置。 实现了多项式相加&#xff0c;多项式相乘。原文章及完整源码在这里 http://binhua.info/datastructure/%E5%8D%95%E9%93%BE%E8%A1%A8…

solidity struct 结构体创建与使用浅学 (四)

环境说明&#xff1a; Ide&#xff1a;在线remix Solidity IDE 语言&#xff1a;solidity solidity 版本号&#xff1a;0.4.20 Tip&#xff1a;如果一点都不懂的建议从头开始看 运行结果截图我不赘述&#xff0c;所有合约代码均通过个人检测。请按照标准进行操作&#xff0c;如…

ORACLE TDE 透明数据加密技术

从ORALE 10GR2开始出现透明数据加密技术(Transparent Data Encryption&#xff0c;TDE)TDE用来对数据加密&#xff0c;通常 SQL 执行的应用程序逻辑不需要进行更改&#xff0c;仍能正常运行。 换言之&#xff0c;应用程序可以使用同一语法将数据插入到应用程序表中&#xff0c;…