写个函数f,f("abc", 2)
aa
ab
ba
bb
f("ab", 3)
aaa
aab
aba
abb
baa
bab
bba
bbbf("abcde",5)
aaaaa
aaaab
.....
我不太清楚这个是不是全排列还是叫别的啥
要求不用递归,栈、链表等,可以用数组

解决方案 »

  1.   

    // 定义一个n元数组A[n],
    // 下标从小到大(0 to n-1)对应于嵌套for循环的由外到内的变量,
    // 它们的值则对应于for循环中的循环变量值。int i;
    for ( i=0; i<n; ++i )
    {
        A[i] <-- A[i]_first;  // 初始值
    }for ( ; ; )
    {
        // Call your function ...    i = n;
        while ( --i >= 0 && A[i] == A[i]_last /* 终止值 */ )
        {
            A[i] <-- A[i]_first; // 复位
        }    if ( i < 0 )
            break;    A[i] <--next(A[i]); // 也许不是简单的递增,反正是 next 到下一个有效值。
    }看到一个算法,不怎么明白
      

  2.   

    哦,是我打错了,应该是f("ab",2)
      

  3.   

    其实是数字的进制问题:
    输出所有小于等于n位的p进制数,其中p为输入字符串的长度。用输入字符串中的各位字符代替数字。
    简单写了个:string[] GetStrings(string baseStr, int count)
    {
    char[] baseChars = baseStr.ToCharArray();
    int b = baseStr.Length;
    int retLen = 0, i = 0;
    try
    {
    retLen = (int)Math.Pow(b, count);
    }
    catch
    {
    throw new ArgumentOutOfRangeException("count");
    }
    string[] results = new string[retLen];
    int[] baseArr = new int[count];
    for (i = 0; i < count; i++) baseArr[i] = 0; //初始化
    for (i = 0; i < retLen; i++)
    {
    results[i] = new string(baseArr.Select(x => baseChars[x]).ToArray()); //构建字符串
    baseArr[count - 1] += 1; //加1
    for (int j = count - 1; j > 0; j--) //进位
    {
    if (baseArr[j] >= b)
    {
    baseArr[j - 1]++;
    baseArr[j] = 0;
    }
    }
    }
    return results;
    }
      

  4.   

    http://topic.csdn.net/u/20090217/21/F41ED9F6-F929-451C-A5C9-80D2E408422A.html
      

  5.   

    谢谢!
    for (i = 0; i < count; i++) baseArr[i] = 0;        //初始化
    这一句是不是可以不要呢
      

  6.   

        class Program
        {
            static void Main(string[] args)
            {
                Comb("abc", 3).ToList().ForEach(Console.WriteLine);
            }        private static string Tr(string str, int n)
            {
                string s = "";
                int len = str.Length;
                while (n >= 0)
                {
                    s = str[n % len] + s;
                    n = n / len - 1;
                }
                return s;
            }        private static IEnumerable<string> Comb(string str, int n)
            {
                int x = str.Length;
                int leng = (int)Math.Pow(x, n);
                var sArr = new string[leng];
                int t = ((int)(Math.Pow(x, n) - x) / (x - 1));
                for (int i = t; i < t + leng; i++)
                {
                    sArr[i - t] = Tr(str, i);
                }
                return sArr;
            }
        }