`
hgfghwq15
  • 浏览: 49781 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

字符串的排列--总结

 
阅读更多

  题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。
  思路:用递归的思路,比较abc,先确定第一个字符a,然后递归解bc的排列,然后确定第二个字符b,然后递归解c的排列。即,先确定第一个字符,这里有三种可能:a,b,c,然后在确定了第一个字符的前提下,确定第二个字符,依次类推。需要注意的是,因为所有操作是在原存储字符串的区域内进行的,所以递归调用之前要先保存原来的字符串,调用之后要进行恢复。
  原文的思路也是这样的,代码如下: void foo28(char *str, int len, int n){ int i; char tmp; char *p = (char *)malloc((len+1)*sizeof(char)); if(n==len-1){ printf("%s\n",str); }else{ for(i=n;i字符串排列的过程。首先我们固定第一个字符a,求后面两个字符bc的排列。当两个字符bc的排列求好之后,我们把第一个字符a和后面的b交换,得到bac,接着我们固定第一个字符b,求后面两个字符ac的排列。现在是把c放到第一位置的时候了。记住前面我们已经把原先的第一个字符a和后面的b做了交换,为了保证这次c仍然是和原先处在第一位置的a交换,我们在拿c和第一个字符交换之前,先要把b和a交换回来。在交换b和a之后,再拿c和处在第一位置的a进行交换,得到cba。我们再次固定第一个字符c,求后面两个字符b、a的排列。
  既然我们已经知道怎么求三个字符的排列,那么固定第一个字符之后求后面两个字符的排列,就是典型的递归思路了。
  基于前面的分析,我们可以得到如下的参考代码:
  void Permutation(char* pStr, char* pBegin);
  ////////////////////////////////////////////////// ///////////////////////
  // Get the permutation of a string, 
  // for example, input string abc, its permutation is 
  // abc acb bac bca cba cab
  ////////////////////////////////////////////////// ///////////////////////
  void Permutation(char* pStr)
  {
  Permutation(pStr, pStr);
  }
  ////////////////////////////////////////////////// ///////////////////////
  // Print the permutation of a string, 
  // Input: pStr   - input string
  //        pBegin - points to the begin char of string 
  //                 which we want to permutate in this recursion
  ////////////////////////////////////////////////// ///////////////////////
  void Permutation(char* pStr, char* pBegin)
  {
  if(!pStr || !pBegin)
  return;
  // if pBegin points to the end of string,
  // this round of permutation is finished, 
  // print the permuted string
  if(*pBegin == '\0')
  {
  printf("%s\n", pStr);
  }
  // otherwise, permute string
  else
  {
  for(char* pCh = pBegin; *pCh != '\0'; ++ pCh)
  {
  // swap pCh and pBegin
  char temp = *pCh;
  *pCh = *pBegin;
  *pBegin = temp;
  Permutation(pStr, pBegin + 1);
  // restore pCh and pBegin
  temp = *pCh;
  *pCh = *pBegin;
  *pBegin = temp;
  }
  }
  }
  扩展1:如果不是求字符的所有排列,而是求字符的所有组合,应该怎么办呢?当输入的字符串中含有相同的字符串时,相同的字符交换位置是不同的排列,但是同一个组合。举个例子,如果输入aaa,那么它的排列是6个aaa,但对应的组合只有一个。
  扩展2:输入一个含有8个数字的数组,判断有没有可能把这8个数字分别放到正方体的8个顶点上,使得正方体上三组相对的面上的4个顶点的和相等。
  原文地址:http://zhedahht.blog.163.com/blog/static/254111742 007499363479/
分享到:
评论

相关推荐

    python中字符串比较使用is、==和cmp()总结

    经常写 shell 脚本知道,字符串判断可以用 =,!= 数字的判断是 -eq,-ne 等,但是 ... 来确定几个字符串的排列顺序。 从官方文档上看 The operators ``is`` and ``is not`` test for object identity: ``x is y``

    Shell学习笔记07–字符串与文本行处理命令总结

    文件搜索命令:grep 语法:grep -iv [指定字串] [文件] 功能描述:在文件中搜索字串匹配的行并...语法:cut -d '分隔字符串' -f fields #用于有特定分隔字符  cut -c 字符区间 #用于排列整齐的信息 选项参数: -d 

    Python中常用操作字符串的函数与方法总结

    例如这样一个字符串 Python,它就是几个字符:P,y,t,h,o,n,排列起来。这种排列是非常严格的,不仅仅是字符本身,而且还有顺序,换言之,如果某个字符换了,就编程一个新字符串了;如果这些字符顺序发生变化了,也...

    PHP字符串逆序排列实现方法小结【strrev函数,二分法,循环法,递归法】

    本文实例总结了PHP字符串逆序排列实现方法。分享给大家供大家参考,具体如下: 关于字符串的逆序排列,最简单的使用PHP函数strrev()的测试代码如下: header('Content-type: text/html; charset=utf-8'); $str = ...

    python中字符串数组逆序排列方法总结

    python中字符串数组如何逆序排列?下面给大家介绍几种方法: 1、数组倒序: 原始元素的倒序排列 (1)切片 >>> arr = [1,2,3,4,3,4]>>> print (arr[::-1])[4, 3, 4, 3, 2, 1] (2)reverse() >>> arr = [1,2,3,4...

    c++ 面试题 总结

    ==strcpy拷贝的结束标志是查找字符串中的\0 因此如果字符串中没有遇到\0的话 会一直复制,直到遇到\0,上面的123都因此产生越界的情况 建议使用 strncpy 和 memcpy ---------------------------------------------...

    明解C语言(第3版)入门篇.[日]柴田望洋(带详细书签).pdf 【半高清】

    用数组实现的字符串和用指针实现的字符串的不同点 318 字符串数组 320 11-2 通过指针操作字符串 323 判断字符串长度 323 字符串的复制 325 不正确的字符串复制 328 返回指针的函数 329 11-3 字符串处理...

    lrucacheleetcode-coderust:使用coderust破解编码面试

    lru缓存leetcode 代码锈 使用 coderust 破解编码面试 总结 大批 链表 数学与统计 字符串 树木 堆栈和队列 图表 回溯 动态规划 各种各样的 附录 问题详情 数组 ...个排列 ...置换字符串 ...字符串 ...字符串分割

    程序员找工作刷题-learn-rust:帮助我学习Rust编程语言的项目

    确定一个字符串是否是另一个字符串的子字符串。 - 总结一个文本文件的内容。 - 在列表中查找总和为一个值的对。 - 增加一个表示为链表的数字。 - 使用在 [0..n] 之间反转列表的函数对列表进行排序。 - 确定二叉树...

    LeetCode解题总结

    13.3 字符串的所有子回文字符串 13.4 最长公共子序列问题 13.5 字符串的编辑距离 13.6 不同路径之和 13.6.1 无障碍13.6.2 有障碍 13.7 最大矩形面积 13.8 字符串交叉组合 13.9 旋转字符串 13.10 最小路径和 13.11 ...

    CCF-CSP必学知识

    对于字符串的以上处理要做到熟练,并且能够快速讲码打出。 例题分析(2013年12月第二题) C(有越界风险,可用c++的动态数组来写): 问题:输入后只是跳过了‘-’,但是无法判断到底这个符号是在哪里,如果输入...

    leetcode-回文数,回文串(非dp,排序问题哈,dp太难,以后再总结)

    思路:那遇到偶数个重复的字符可以直接加入,遇到奇数个可以直接-1加入(减一之后就是偶数了),最后还要判断下,如果当前长度小于原字符串长度,则+1,因为可以有一个奇数字符在正中间,如果是等于,则直接返回该...

    vue 实现模糊检索并根据其他字符的首字母顺序排列

     产品:我觉得你这里可以加一个排序,根据他的没有非搜索词的其他字符的首字母顺序排列一下。(一口气说的我有点懵 )  过了3分钟我才明白他的意思,就是根据第二个字的首字母的拼音排序。然后,接着改呗    又是5...

    算法文档,来看看吧

    [原网页] 程序员编程艺术第三十~三十一章:字符串转换成整数,通配符字符串匹配 [原网页] 程序员编程艺术第二十八~二十九章:最大连续乘积子串、字符串编辑距离 [原网页] 数据挖掘中所需的概率论与数理统计知识、...

    sqlserver2000基础(高手也有用)

    3.6 字符串在动态Transact-SQL语句中的应用 85 3.6.1 动态Transact-SQL语句概述 85 3.6.2 字符串在编号查询中的使用 87 3.6.3 动态参数存储过程 90 3.6.4 动态Transact-SQL语句中常见问题 92 3.7 text与...

    常用算法代码

    | 最短公共祖先(多个短字符串) 33 Geometry 计算几何 34 | GRAHAM 求凸包 O(N * LOGN) 34 | 判断线段相交 34 | 求多边形重心 34 | 三角形几个重要的点 34 | 平面最近点对 O(N * LOGN) 34 | LIUCTIC 的...

    SQL SERVER 2000开发与管理应用实例

    3.6 字符串在动态Transact-SQL语句中的应用 85 3.6.1 动态Transact-SQL语句概述 85 3.6.2 字符串在编号查询中的使用 87 3.6.3 动态参数存储过程 90 3.6.4 动态Transact-SQL语句中常见问题 92 3.7 ...

    计算机应用基础知识总结大全精编.docx

    字符数据主要指西文的 A SCII 码和汉字,计算机内是用什么代码表示的 计算机应用基础知识总结大全精编全文共34页,当前为第4页。 A SCII 码:用 7 位二进制数表示的或用一个字节表示,最高位为 0 这是事实上的国际...

Global site tag (gtag.js) - Google Analytics