【牛客刷题专栏】0x30:JZ38 字符串的排列(C语言编程题)

news/2024/10/24 9:21:19/

前言

  • 个人推荐在牛客网刷题(点击可以跳转),它登陆后会保存刷题记录进度,重新登录时写过的题目代码不会丢失
  • 个人刷题练习系列专栏:个人CSDN牛客刷题专栏。 题目来自:牛客/题库 / 在线编程 / 剑指offer:
    在这里插入图片描述

目录

  • 前言
  • 问题描述:
  • 解法思路:
  • 代码结果:
  • 结束语


问题描述:

  • 输入一个长度为 n 字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组。

  • 例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。
    在这里插入图片描述

  • 数据范围:n<10

  • 要求:空间复杂度 O(n!),时间复杂度 O(n!)获取此时栈中最小元素==>返回-1


---
# 举例:
```c
//示例1:
//输入:
"ab"
//返回值:
["ab","ba"]
//说明:返回["ba","ab"]也是正确的  
//=======================
//示例2:
//输入:
"aab"
//返回值:
["aab","aba","baa"]
//=======================
//示例3:
//输入:
"abc"
//返回值:
["abc","acb","bac","bca","cab","cba"]
//=======================
//示例4:
//输入:
""
//返回值:
[""]

解法思路:

  • 1.解题思路:还是以具体例子思考:从最简单的出发:一个字符:a,只有一种排列方式;两个字符:ab,排列方式有 ab,ba;三个字符,cab,由于 ab有两种排列方式 c这个字符可以与a b这两个字符任意调换位置。因此有 cab acb bac cba bca abc;以此类推,假设一个较长的字符串:abcdabc,那么可以考虑字符 a + bcdabc之间的组合。只需要确定了bcdabc的全排列后,那么替换a到这些位置即可,也就是a bcdabc的全排列就简化成了 bcdabc的全排列,以此类推,递归解决所有问题。
  • 2.重点:如何去除全排列中的重复序列呢?比如说 aabb,同样的考虑a+abb递归解决,但是当a和a替换位置 是无效的,同样的 a和第一个b替换以及a和第二个b替换也是等价的。因此在替换之前需要再遍历一次来判断是否之前已经出现过。

代码结果:

 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param str string字符串 * @return string字符串一维数组* @return int* returnSize 返回数组行数** C语言声明定义全局变量请加上static,防止重复定义*///两个全局变量 一个记录所有的结果 另一个判断是否重复
static int top=0;
static int flag=0;
//字符交换
int swap(char *a, char *b) {char temp = *a;*a = *b;*b = temp;return 1;
}
int perm(char **ans,char *str, int m,int n) {//到结尾了 复制一下str到ansif (m == n) {ans[top]=(char *)malloc(sizeof(char) *n);strcpy(ans[top++],str);}else {//这里就是最外层的循环 也就是将m指向的字符 分别与之后的字符依次交换for (int i = m; i < n; i++) {//这里就是去重了 在起始位置m和遍历位置i之间遍历是否已经出现相同字符 从而跳过此次遍历for(int j=m;j<i;j++){if(str[j]==str[i]){flag=1;break;}}if(flag==1){flag=0;continue;}//m和i 交换 字符swap(&str[m], &str[i]);//然后求一个后续的全排列perm(ans,str, m + 1, n);//然后交换回来swap(&str[m], &str[i]);}}return 0;
}
char** Permutation(char* str, int* returnSize ) {if(str==NULL){*returnSize=0;return NULL;}// write code herechar **ans=NULL;int len=strlen(str);ans=(char **)malloc(sizeof(char *)*1000);perm(ans,str,0,len);*returnSize=top;return ans;
}


结束语

  • 以上就是该C语言编程题的内容。可以在牛客尝试刷几道题目来练习实践。牛客网刷题(点击可以跳转),可以尝试注册使用。
  • 题目来自:牛客/题库 / 在线编程 / 剑指offer:
    在这里插入图片描述

http://www.ppmy.cn/news/74114.html

相关文章

管中窥豹!从冠德石油看数字化对加油站的影响力

从上个世纪90年代起&#xff0c;至2010年前后&#xff0c;是国内信息化建设的高速发展期。这段时间无论是应用软件、企业网站还是商业咨询&#xff0c;无不呈现井喷式发展。大多数企业和政府机关均完成了或多或少的信息化建设。IT带来了标准化、科学化的管理和运作模式&#xf…

当Python遇上异步编程:实现高效、快速的程序运行!

前言 同步/异步的概念&#xff1a; 同步是指完成事务的逻辑&#xff0c;先执行第一个事务&#xff0c;如果阻塞了&#xff0c;会一直等待&#xff0c;直到这个事务完成&#xff0c;再执行第二个事务&#xff0c;顺序执行 异步是和同步相对的&#xff0c;异步是指在处理调用这…

C++——内存管理+模块

作者&#xff1a;几冬雪来 时间&#xff1a;2023年5月19日 内容&#xff1a;C——内存管理模块 目录 前言&#xff1a; 1.new和delete操作自定义类型&#xff1a; operator new/delete&#xff1a; 定位new表达式&#xff08;placement-new&#xff09;&#xff1a; …

Lucene(4):Field域类型

1 Field属性 Field是文档中的域&#xff0c;包括Field名和Field值两部分&#xff0c;一个文档可以包括多个Field&#xff0c;Document只是Field的一个承载体&#xff0c;Field值即为要索引的内容&#xff0c;也是要搜索的内容。 是否分词(tokenized) 是&#xff1a;作分词处理…

Git的项目管理工具的使用

Git的项目管理工具的使用 为什么学习Git软件&#xff1f; 主流开发中&#xff0c;基于互联网的开发项目都会使用git进行资源管理 资源管理&#xff1a;人力资源 ​ 代码资源 : .java .c . js 等 ​ 文档资源 &#xff1a; doc.md ,pdf 等 git是最常用的scm软件&#xff08;Soft…

软考初级程序员上午单选题(15)

1、在目前流行的大多数PC中&#xff0c;硬盘一般是通过硬盘接口电路连接到______。 A&#xff0e;CPU局部总线 B&#xff0e;PCI总线 C&#xff0e;ISA总线(AT总线) D&#xff0e;存储器总线 2、松耦合多处理机实现处理机间通信靠的是______。 A&#xff0e;共享主存 B&#x…

错题汇总10

1.如果MyClass为一个类&#xff0c;执行”MyClass a[5], *b[6]”语言会自动调用该类构造函数的次数是 A 2 B 5 C 4 D 9 5个Myclass对象的一个数组&#xff0c;调用5次Myclass类的构造函数 b实际为一个指针数组&#xff0c;该数组中每个元素都是Myclass*&#xff0c;不会调用…

linux中 list_entry 设计背景及原理解析

Linux 2.4.22 在这一版本中的 list_entry的宏定义实现如下&#xff1a; #define list_entry(ptr, type, member) \((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))乍一看&#xff0c;会觉得特别复杂&#xff0c;其实分析之后&#xff0c;会发现清晰…