博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ1256 Anagram(回溯法)
阅读量:5788 次
发布时间:2019-06-18

本文共 1232 字,大约阅读时间需要 4 分钟。

题意:

输出字符串中字符的所有排列方式

要点:

回溯法可以将每种情况遍历一遍(注意跳过连续的相同的字符),重点在于排序,先排序再回溯可以保证输出按照字典序,但这题的排序不太一样:'A'<'a'<'B'<'b'<...<'Z'<'z',所以cmp要分情况讨论才行

15178810 Accepted 164K 63MS 1004B 2016-02-19 21:22:48
#include
#include
#include
char str[15], out[15];bool idx[15];int len;int cmp(const void *a, const void *b)//排序比较复杂,要分别考虑大小写{ char c = *(char *)a; char d = *(char *)b; if (c >= 97) { c -= 32; if (d >= 97) { d -= 32; return c - d; } else { if (c == d) return 1;//A和a这种情况输出c
= 97) { d -= 32; if (c == d) return -1; else return c - d; } return c - d; }}void backtrace(int n){ if (n == len) { printf("%s\n", out); return; } for (int i = 0; i < len; i++) { if (idx[i] == false) { out[n] = str[i]; idx[i] = true; backtrace(n + 1); //标准回溯法 idx[i] = false; int k = i + 1; //跳过相同的 while (k < len&&str[k] == str[k - 1]) k++; i = k - 1; //i后面会i++,所以这里-1 } }}int main(){ int t; scanf("%d", &t); while (t--) { memset(idx, false, sizeof(idx)); scanf("%s", str); len = strlen(str); out[len] = '\0'; //最后末尾加上字符串标识 qsort(str, len, sizeof(str[0]), cmp); backtrace(0); } return 0;}

转载于:https://www.cnblogs.com/seasonal/p/10343847.html

你可能感兴趣的文章
java工程师linux命令,这篇文章就够了
查看>>
关于React生命周期的学习
查看>>
webpack雪碧图生成
查看>>
搭建智能合约开发环境Remix IDE及使用
查看>>
Spring Cloud构建微服务架构—服务消费基础
查看>>
RAC实践采坑指北
查看>>
runtime运行时 isa指针 SEL方法选择器 IMP函数指针 Method方法 runtime消息机制 runtime的使用...
查看>>
LeetCode36.有效的数独 JavaScript
查看>>
Scrapy基本用法
查看>>
PAT A1030 动态规划
查看>>
自制一个 elasticsearch-spring-boot-starter
查看>>
软件开发学习的5大技巧,你知道吗?
查看>>
【人物志】美团前端通道主席洪磊:一位产品出身、爱焊电路板的工程师
查看>>
一份关于数据科学家应该具备的技能清单
查看>>
机器学习实战_一个完整的程序(一)
查看>>
Web框架的常用架构模式(JavaScript语言)
查看>>
如何用UPA优化性能?先读懂这份报告!
查看>>
这些Java面试题必须会-----鲁迅
查看>>
Linux 常用命令
查看>>
CSS盒模型
查看>>