zoukankan      html  css  js  c++  java
  • 【IT笔试面试题整理】字符串的组合

       【试题描述】输入一个字符串,输出该字符串中字符的所有组合。举个例子,如果输入abc,它的组合有a、b、c、ab、ac、bc、abc。

    分析:这是一道很好的考查对递归理解的编程题,因此在过去一年中频繁出现在各大公司的面试、笔试题中。

    思路:同样是用递归求解。可以考虑求长度为n的字符串中m个字符的组合,设为C(n,m)。原问题的解即为C(n, 1), C(n, 2),...C(n, n)的总和。对于求C(n, m),从第一个字符开始扫描,每个字符有两种情况,要么被选中,要么不被选中,如果被选中,递归求解C(n-1, m-1)。如果未被选中,递归求解C(n-1, m)。不管哪种方式,n的值都会减少,递归的终止条件n=0或m=0。

    假设我们想在长度为n的字符串中求m个字符的组合。我们先从头扫描字符串的第一个字符。针对第一个字符,我们有两种选择:一是把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选取m-1个字符;二是不把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选择m个字符。
    这两种选择都很容易用递归实现。

    【参考代码】

     1 public static void combination(char[] arr,int begin,int number ,LinkedList<Character> result)
     2     {
     3         if(number == 0)
     4         {
     5             System.out.println(result.toString());
     6             return;
     7         }
     8         if( begin == arr.length)
     9             return;
    10         result.add(arr[begin]);
    11         combination(arr,begin+1,number-1,result);
    12         result.pollLast();
    13         combination(arr,begin+1,number,result);
    14         
    15     }
    16     public static void combination(char[] arr)
    17     {
    18         if(arr.length == 0)
    19             return;
    20         LinkedList<Character> list = new LinkedList<Character>();
    21         for(int i=1;i<=arr.length;i++)
    22             combination(arr,0,i,list);
    23     }
  • 相关阅读:
    PowerDesigner中利用数据库表反向生成PDM(jdk必须是32位)
    Struts2 Web Project 实现中文、英语的切换
    一张图解决Struts2添加源码
    Struts2配置文件struts.xml的编辑自动提示代码功能
    Hibernate多对一(注解)
    SQL Server 日期和时间函数
    ORACLE日期时间函数大全
    ORACLE中函数MONTHS_BETWEEN的使用
    SQL经典面试题及答案
    SQL数据库面试题以及答案
  • 原文地址:https://www.cnblogs.com/WayneZeng/p/3014882.html
Copyright © 2011-2022 走看看