首页 新闻 会员 周边

算法题:用C#实现返回一个字符串的字符所有组合

0
悬赏园豆:5 [已解决问题] 解决于 2014-06-08 17:52

用C#实现返回一个字符串的字符所有组合,输入的字符串中字符不能有重复。如输入"ABC",返回{"ABC","ACB","BAC","BCA"...},输入WXYZ,返回{"WXYZ","WYXZ","WYZX"...}.

xiaoafei1991的主页 xiaoafei1991 | 菜鸟二级 | 园豆:466
提问于:2014-03-15 21:29
< >
分享
最佳答案
0

这个问题还是稍有难度的。

收获园豆:5
空明流光 | 初学一级 |园豆:106 | 2014-03-17 10:45
public List<string> GetPattern(string str)
        {
            if (string.IsNullOrEmpty(str))
                return null;
            else if (str.Length == 1)
                return new List<string> { str };

            var result = new List<string>();
            var current = str[0];
            var sbChildren = GetPattern(str.Substring(1));
            foreach (var child in sbChildren)
            {
                for (var i = 0; i <= child.Length; i++)
                    result.Add(child.Insert(i, current.ToString()));
            }
            return result;
        }


即兴写了一个,试了下,可以得到效果,但性能和效率你自己得优化下。这里没考虑你给AAC这种包含重复字符的情况。而且如果递归嵌套层数过多CLR也会报错。内存优化也没有做,我试了一个长点的,报内存举出,估计是返回的数据量过大导致、

空明流光 | 园豆:106 (初学一级) | 2014-03-17 11:08
其他回答(6)
0

这是Google还是Baidu的面试题,需要巧妙的解题思路,高级算法、还是只要有答案就行?

如果只要能得出答案,就很容易,如果需要高大上的答案,请明说...

爱编程的大叔 | 园豆:30839 (高人七级) | 2014-03-15 23:09

这是我上一家公司的笔试题,是个小公司,原题是:用程序实现"XYZ"的所有组合?这个倒是简单,我在这个题的基础上进行了扩展。只要写代码能实现就行。

支持(0) 反对(0) xiaoafei1991 | 园豆:466 (菜鸟二级) | 2014-03-16 09:30

@xiaoafei1991: 

这样就简单了,你先考虑下数量是多少,应该是

n*(n-1)*(n-2)...*1

拆解为代码的思路如下

1、第一位有N种可能

2、后面就是递归了,变成求解N-1的变化

代码你自己考虑下,OK?

支持(1) 反对(0) 爱编程的大叔 | 园豆:30839 (高人七级) | 2014-03-16 11:15
0

高数上有排列和组合的概念 你可以参考下

wolfy | 园豆:2636 (老鸟四级) | 2014-03-17 13:04
0

难。这个题在实际中有意义吗?工作N年,你遇到了吗?

lucika.zh | 园豆:62 (初学一级) | 2014-03-18 11:28
0

感觉和图论,图的遍历有关系

Desmond | 园豆:281 (菜鸟二级) | 2014-03-18 11:53
0
 1         static void Main(string[] args)
 2         {
 3             Console.WriteLine("请输入字符串:");
 4             string str = Console.ReadLine();
 5             List<string> list= GetGroups(str);
 6             Console.WriteLine("结果:");
 7             list.ForEach(s=>Console.Write(s+"\t"));
 8             Console.ReadKey();
 9         }
10 
11         #region 1.0 返回所有字符串组合集合  List<string> GetGroups(string str)
12         /// <summary>
13         /// 返回所有字符串组合集合
14         /// </summary>
15         /// <param name="str">需要组合的字符串</param>
16         /// <returns></returns>
17         static List<string> GetGroups(string str)
18         {
19             //创建随机函数
20             Random rdom = new Random();
21             //创建字符串变量用来接收的产生的组合的每一种可能
22             string re = "";
23             //使用函数,递归求出有多少组合可能
24             int count = GetNum(str.Length);
25             //创建集合
26             List<string> list = new List<string>(count);
27             // 如果集合中的个数小于可能组合的个数,则继续循环
28             while (list.Count < count)
29             {
30                 //产生输入字符串个数的随机数
31                 int index = rdom.Next(0, str.Length);
32                 // 判断字符串变量中是否包含产生的字母,如果不包含则拼接到字符串上
33                 if (!re.Contains(str[index]))
34                 {
35                     re += str[index];
36                 }
37                 // 判断拼接字符串的长度有没有达到输入字符串的长度
38                 if (re.Length == str.Length)
39                 {
40                     //判断集合中有没有包含该字符串,如果没有,加入集合
41                     if (!list.Contains(re))
42                     {
43                         list.Add(re);
44                     }
45                     //清空字符串
46                     re = "";
47                 }
48             }
49             return list;
50         }
51         #endregion
52 
53         #region 2.0 求出输入数值的阶乘 int GetNum(int num1)
54         /// <summary>
55         /// 求出输入数值的阶乘
56         /// </summary>
57         /// <param name="num1"></param>
58         /// <returns></returns>
59         static int GetNum(int num1)
60         {
61             if (num1 <= 1)
62             {
63                 return 1;
64             }
65             else
66             {
67                 return num1 * GetNum(num1 - 1);
68             }
69         }
70         #endregion
View Code
绝崖绿色 | 园豆:200 (初学一级) | 2014-03-20 15:34

随机数都用了上,随机数在这儿起什么作用?没看懂,看着也没有我上面的简洁啊

支持(1) 反对(0) 空明流光 | 园豆:106 (初学一级) | 2014-03-22 11:35
0

这是全排列的问题。

白来了123 | 园豆:160 (初学一级) | 2014-05-05 10:13
void swap(elemType* list,int i,int j){
    int temp=list[i];
    list[i]=list[j];
    list[j]=temp;
}
void perm(elemType* list,int k,int m){
    if (k==m){
        for (int i=0;i<m;i++){
            cout<<list[i]<<" ";
        }
        count++;
        cout<<endl;
    }
    for(int j=k;j<m;j++){
        swap(list,k,j);
        perm(list,k+1,m);
        swap(list,j,k);
    }
}

 

支持(1) 反对(0) 白来了123 | 园豆:160 (初学一级) | 2014-05-05 10:32
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册