写个函数f,f("abc", 2)
aa
ab
ba
bb
f("ab", 3)
aaa
aab
aba
abb
baa
bab
bba
bbbf("abcde",5)
aaaaa
aaaab
.....
我不太清楚这个是不是全排列还是叫别的啥
要求不用递归,栈、链表等,可以用数组
aa
ab
ba
bb
f("ab", 3)
aaa
aab
aba
abb
baa
bab
bba
bbbf("abcde",5)
aaaaa
aaaab
.....
我不太清楚这个是不是全排列还是叫别的啥
要求不用递归,栈、链表等,可以用数组
// 下标从小到大(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 到下一个有效值。
}看到一个算法,不怎么明白
输出所有小于等于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;
}
for (i = 0; i < count; i++) baseArr[i] = 0; //初始化
这一句是不是可以不要呢
{
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;
}
}