题解 | #字符串的排列#

字符串的排列

http://www.nowcoder.com/practice/fe6b651b66ae47d7acce78ffdd9a96c7

C语言实现字符串的全排列

  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到ans
	if (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 here
    char **ans=NULL;
    int len=strlen(str);
    ans=(char **)malloc(sizeof(char *)*1000);
    perm(ans,str,0,len);
    *returnSize=top;
    return ans;
}
全部评论
不能通过啊
点赞 回复 分享
发布于 2022-07-20 13:50
你这空间不够9的阶乘到三十多w了,你才开辟1000的空间,把这个1000改为400000就能过了
点赞 回复 分享
发布于 2023-07-25 15:32 北京
这段代码会报错,不能通过
点赞 回复 分享
发布于 2022-06-28 22:39

相关推荐

24分钟1.自我介绍2.黑盒测试用例设计方法3.运用刚才的测试方法对手机端淘宝购物车结算页面进行测试4.测试流程5.需求文档没有标明边界值,怎么确定边界值,确定边界值后怎么测6.你们公司自动化测试是测业务主流程还是新需求反问:不足之处答:问答问题前思考3s再答,针对提问再答
一笑而过2222:边:边界值分析法(处理输入边界) 类:等价类划分法(划分有效 / 无效输入) 定:判定表法(多条件组合的逻辑判定) 因:因果图法(分析输入输出的因果关系) 迁:状态迁移法(覆盖系统状态转换路径) 场:场景法(模拟端到端业务流程) 正:正交试验法(多因素组合的测试优化) 错:错误推测法(基于经验推测潜在漏洞) 记忆逻辑链(按测试场景优先级排序) 先处理明确输入:边界值 + 等价类(边类) 再处理条件组合:判定表 + 因果图(定因) 接着处理状态与流程:状态迁移 + 场景法(迁场) 最后优化多因素与补漏:正交试验 + 错误推测(正错)
查看6道真题和解析
点赞 评论 收藏
分享
06-19 16:59
门头沟学院 Java
是秃子总会发光_:给他一巴掌
点赞 评论 收藏
分享
06-08 22:25
门头沟学院 Java
从零开始的转码生活:这hr不会打开手机不分青红皂白给所有人群发这句话,过一会再给所有人再发一遍,这肯定会有重复的,不管,再过一会再发一遍
点赞 评论 收藏
分享
评论
2
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务