打印给定字符串中字符的所有排列

题目:

  输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。





解决:

  简单起见,字符串中没有相同的字符。

  其实这是个递归的过程:对于字符串str,先分别逮住其中的每一个,如s,把它从str中踢开,成了 s + tr(下一次踢开t变为 t + sr),然后对于剩下来的,再从剩下的再次分别踢开一个加到左边的后面(假想被踢开的都在左边,剩下的都在右边哈),一直如此,直至右边都踢光了。算法如下:  

void show(strL, strR)
{
    if (strR不是空字符串)
    {
        for (对于strR中的每一个字符)
        {
            把这个字符踢到strL的后面
            递归show()
        }
    }
    else
    {
        显示左边的字符串
    }
}

  代码如下:

 1 #include <iostream>
 2 #include <string>
 3
 4 using std::cout;
 5 using std::endl;
 6 using std::cin;
 7 using std::string;
 8
 9 //在这个过程中,把字符串分为左右两半,左边的字符已经固定,右边的可以组合出各种情况
10 //最后把左边固定的和右边各种情况一一连接,就是完整的各种字符串了
11 void show(string strL, string strR)
12 {
13     if (!strR.empty())        //右边的非空
14     {
15         for (int i = 0; i < strR.size(); i++)        //对于每种情况
16         {
17             //注意要用左右字符串的副本
18             string tempL = strL;
19             string tempR = strR;
20
21             tempL.append(1, strR[i]);        //把那个字符添加到左边字符串的后面
22             tempR.erase(i, 1);        //右边的字符串中删除那个
23             show(tempL, tempR);        //递归进行
24         }
25     }
26     else
27     {
28         cout << strL << endl;
29     }
30 }
31
32 int main(void)
33 {
34     string left;
35     string test("abcde");
36
37     show(left, test);
38     cout << "------------------------------------\n" << left << endl << test;
39
40     cin.get();
41 }

  结果:





总结:

  递归的思想。

  其实可以看做一棵树,从根节点开始分叉,每一个分叉是一种情况,最终到叶节点的高度为n,n为字符串长度,每个叶节点是一种情况。

打印给定字符串中字符的所有排列

时间: 2024-10-08 14:29:21

打印给定字符串中字符的所有排列的相关文章

【20190405】算法-输入一个字符串,按字典序打印出该字符串中字符的所有排列

方法一:利用递归 利用递归求全排列的过程真的很难理解,先把代码贴上来吧 function Permutation(str) { // write code here if(!str){ return str; } let len=str.length, result=[]; str=str.split('');// 字符串的索引属性都是只读,后面要交换两个字符的话还是要先把字符串转化为数组 str.sort();// 直接把字符串按字典序排列了,后面求全排列时也会按照字典序 Permutate(

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

package myprac.LeetCode; import java.util.ArrayList; import java.util.List; public class StringPermutation { /* public static ArrayList<String> Permutation(String str) { ArrayList<String> list = new ArrayList<>(); if(str==null || str.len

【C语言】自己编写程序实现strchr函数。即在给定字符串中找特定的字符并返回该处指针。

<pre name="code" class="cpp">//自己编写程序实现strchr函数.即在给定字符串中找特定的字符并返回该处指针. #include <stdio.h> char * my_strchr(char const *str,int ch) { while(*str!='\0') { if(*str!=ch) str++; else return str; } printf("未找到该字符\n"); r

【C语言】自己编写程序实现strrchr函数,即在给定字符串中找特定的字符并返回最后出现的位置

//自己编写程序实现strrchr函数,即在给定字符串中找特定的字符并返回最后出现的位置 #include <stdio.h> #include <string.h> char * my_strrchr(char const *str,int ch) { int count=0; while(*str!='\0') { count++; str++; } str--; while(count) { if(*str!=ch) { str--; count--; } else retu

华为机试—给定字符串中找出单词

题目: 在给定字符串中找出单词("单词"由大写字母和小写字母字符构成,其他非字母字符视为单词的间隔,如空格.问号.数字等等:另外单个字母不算单词):找到单词后,按照长度进行降序排序,(排序时如果长度相同,则按出现的顺序进行排列),然后输出到一个新的字符串中:如果某个单词重复出现多次,则只输出一次:如果整个输入的字符串中没有找到单词,请输出空串.输出的单词之间使用一个"空格"隔开,最后一个单词后不加空格. 要求实现函数: void my_word(charinput[

js:重复输出字符串中字符

复习了 重复输出一个字符串后, 重复输出一个字符串是 比如给定 str:abc  num:3 要求输出 abcabcabc 文章链接:https://www.cnblogs.com/mobu/p/9899062.html 之后,我研究起了 重复输出字符串中字符 比如给定 str:abc  num:3 要求输出 aaabbbccc 除了对字符串迭代的方法,剩下的方法相当于把字符串分成数组,然后再用上一个方法输出 /******************************************

技巧之C#统计字符串中字符出现的次数(转)

方法1.自定义类 class CharNum { private char c; private int num; public char C { get { return c; } } public int Num { get { return num; } set { num = value; } } public CharNum(char ch) { this.c = ch; this.num = 1; } } static void Main(string[] args) { /* */

字符串中字符的个数和字符序列

题目 输出上次字符串中字符的个数和字符 最终的序列如下: 1, 11, 21, 1211, 111221, ... n=1时,输出字符串"1" n=2时,输出上次字符串中字符的个数和字符,因为上次字符串有1个1,所以输出11 n=3时,由于上次字符是11,有2个1,所以输出21 n=4时,由于上次字符串是21,有1个2和1个1,所以输出1211 依次类推,写个countAndSay(n)函数返回字符串. 参考代码 class Solution { public: string getN

java统计字符串中字符及子字符串个数

import java.util.Scanner;public class Counter { static Scanner scanner = new Scanner(System.in); public static void count(String s) { int low, upper, num, others; low = upper = num = others = 0; for (int i = 0; i < s.length(); i++) { if (Character.is