如何使函数在C#中以给定顺序返回下一个字符串

时间:2018-01-01 15:08:56

标签: c#

我想创建一个函数,列出首先按长度排序然后按字母顺序排序的字符串。我试着像

那样做
 public static string nextstring(string s) {
     String next = ((char)(s[0] + 1)).ToString();
     return next;
 }

但是如何修改代码以使其适用于更长的字符串?我的目标是按顺序打印所有字符串,如a,b,c,...,z,aa,ab,ac,...,az,ba,...,zz,aaa ......

3 个答案:

答案 0 :(得分:2)

首先,考虑增加十进制数的算法:

  • 您要做的第一件事就是递增最低有效数字
  • 如果增量后的数字值低于10,则完成
  • 如果值为10,则将数字设置为零,然后递增下一个更高的数字
  • 如果没有下一个更高的数字要递增,请在数字
  • 前插入1

你的字符串可以被认为是base-26系统中的数字,略有扭曲(没有零)。你从最后一个字母的增量开始;如果结果超过'z',请返回'a',然后转到下一个字母;如果您用尽所有字母,请在值前插入'a'

以下是此方法的一种可能实现方式:

static string Increment(string s) {
    var chars = s.ToCharArray();
    int carry = 1;
    var i = s.Length-1;
    while (i >= 0) {
        chars[i] += (char)carry;
        if (chars[i] <= 'z') {
            carry = 0;
            break;
        }
        chars[i] = 'a';
        carry = 1;
        i--;
    }
    var res = new string(chars);
    return (i == -1 && carry != 0) ? "a"+res : res;
}

Demo.

答案 1 :(得分:0)

如果我没有误解你的请求,你正在寻找的是一个有序递增的字符序列,这个实现应该产生你想要的东西:

private static List<String> CharCombos(Int32 maximumSize)
{
    const String alphabet = "abcdefghijklmnopqrstuvwxyz";

    IEnumerable<String> projection = alphabet.Select(x => x.ToString()).ToList();
    List<String> result = new List<String>(projection);

    for (Int32 j = 1; j < maximumSize; ++j)
    {
        projection = projection.SelectMany(x => alphabet, (x, y) => x + y);
        result.AddRange(projection);
    }

    return result;
}

以下代码:

foreach (String combo in CharCombos(3))
    Console.WriteLine(combo);

将产生:

a
b
...
y
z
aa
ab
...
zy
zz
aaa
aab
...
zzy
zzz

您可以看到一个有效的例子here。我知道这会改变你当前实现的逻辑,提出一种新的方法,而不是正确地修改现有的方法,但我希望你无论如何都能欣赏它。

答案 2 :(得分:0)

请尝试以下操作。

string SingleEntry(int number)
    {
        char[] array = " ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToArray();
        Stack<string> entry = new Stack<string>();
        List<string> list = new List<string>();
        int bas = 26;

        int remainder = number, index = 0;
        do
        {
            if ((remainder % bas) == 0)
            {
                index = bas;
                remainder--;
            }
            else
                index = remainder % bas;

            entry.Push(array[index].ToString());
            remainder = remainder / bas;
        }
        while (remainder != 0);

        string s = "";
        while (entry.Count > 0)
        {
            s += entry.Pop();
        }
        return s;
    }