惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Full Disclosure
V
Vulnerabilities – Threatpost
Attack and Defense Labs
Attack and Defense Labs
N
News and Events Feed by Topic
SecWiki News
SecWiki News
S
Security @ Cisco Blogs
Schneier on Security
Schneier on Security
B
Blog
TaoSecurity Blog
TaoSecurity Blog
The Last Watchdog
The Last Watchdog
H
Hacker News: Front Page
Hacker News - Newest:
Hacker News - Newest: "LLM"
博客园_首页
D
Docker
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Y
Y Combinator Blog
W
WeLiveSecurity
N
News and Events Feed by Topic
F
Fortinet All Blogs
PCI Perspectives
PCI Perspectives
WordPress大学
WordPress大学
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Recent Announcements
Recent Announcements
Forbes - Security
Forbes - Security
T
Tailwind CSS Blog
Hacker News: Ask HN
Hacker News: Ask HN
爱范儿
爱范儿
腾讯CDC
Last Week in AI
Last Week in AI
月光博客
月光博客
C
Cybersecurity and Infrastructure Security Agency CISA
P
Proofpoint News Feed
Help Net Security
Help Net Security
V
V2EX
C
Cyber Attacks, Cyber Crime and Cyber Security
C
CXSECURITY Database RSS Feed - CXSecurity.com
H
Heimdal Security Blog
L
LINUX DO - 最新话题
GbyAI
GbyAI
The Hacker News
The Hacker News
罗磊的独立博客
S
SegmentFault 最新的问题
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园 - 【当耐特】
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
V2EX - 技术
V2EX - 技术
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
O
OpenAI News
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻

博客园 - 进击的程序员

cuowu Angular4+路由 由href return false 来看阻止默认事件 TypeScript的配置文件 tsconfig.json Java标记接口 动手编写TCP服务器系列之一:日志文件 Shell语言系列之一:文件处理 给Amazon ec2 增加卷(Volume)并挂载到系统 Java打包问题之一:打包出现java.io.IOException: invalid header field struct中长度为0的数组用途与原理 面试题之堆栈队列系列一:设计包含min函数的栈 awk处理之案例六:awk根据条件插入文本 程序员的数学之余数:星期数的思考 面试题之实现系统函数系列一:实现memmove函数 awk处理之案例五:awk匹配字段2包含字段1的文本 awk处理之案例四:sort加awk来过滤文本 awk处理之案例三:awk去掉不需要的文本行 awk处理之案例二:awk匹配文本 awk处理之案例一:awk 处理百分比的问题
字符串面试题系列之七:字符串全排列
进击的程序员 · 2013-08-09 · via 博客园 - 进击的程序员

编译环境

   本系列文章所提供的算法均在以下环境下编译通过。

【算法编译环境】Federa 8,linux 2.6.35.6-45.fc14.i686
【处理器】 Intel(R) Core(TM)2 Quad CPU Q9400 @ 2.66GHz
【内存】 2025272 kB

前言

    这是一道排列组合的题目。对于排列组合的题目在面试当中也是十分常见,主要考察小伙伴们的思维的有序性和解决问题的能力。本题就曾出自腾讯的笔试当中。一般这类题目大家做的时候用树的方式来帮助思考会有一些效果。

    本系列文章均系笔者所写,难免有一些错误或者纰漏,如果小伙伴们有好的建议或者更好的算法,请不吝赐教。

正文

【题目】

   输入一个字符串,打印出该字符串中字符的所有排列。

【例子】

   输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。

【分析】

   这是一道排列组合的题目。而做排列组合的时候头脑要保持清醒并且有序。我们列举一个例子,假设有字符串abc,如果我们手动排列,过程是怎样的呢?

   一般人的分析习惯总是把大问题化成小问题来解决。这是我们的习惯。
首先保持a在第一位不动,我们看子字符串bc,bc的排列是bc和cb,这样我们得到结果是abc,acb ;
其次保持b在第一位不东,我们看子字符串ac,ac的排列是ac和ca,这样我们得到结果是bac,bca ;
再次保持c在第一位不东,我们看子字符串ab,ab的排列是ab和ba,这样我们得到结果是cab,cba
这样我们都得到三个字符的排列是abc,acb,bac,bca,cab,cba。这样思维是不是很清晰。

   参照上面的手工做法,我们如何用程序去实现呢。显然用递归的方式更符合我们的思维。

第一步:当字符串只有1个字符的时候,其排列是字符本身。
第二步:递归求出子字符串的排列
第三步:算法结束。

【代码】

#include <iostream>
#include <cstring>

#define swap(a, b) { char c=a; a=b; b=c; }

void string_permutation( char * const string, int start, int end )
{
   if( start == end )
   {
      std::cout << string << std::endl;
   }
   else
   {
      for( int i = start; i < end; i++)
      {
         // swap two characters
         swap( string[i], string[start] );
         string_permutation( string, start + 1, end );
         // recover
         swap( string[i], string[start] );
      }
   }
}

int main( int argc, char ** argv )
{
   char string[] = "abcd";
   string_permutation( string, 0, strlen(string) );
   return 0;
}

【结论】

   我们输入字符串abcd,应该有16种排列组合的方式。得到的结果如下:

11

作者

   出处:http://www.cnblogs.com/gina

   本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。