测试字符串中的所有可能性

本文关键字:可能性 字符串 测试 | 更新日期: 2023-09-27 18:33:16

我正在尝试测试(与内存中的另一个值进行比较)字符串中所有可能的组合,但想知道最好的方法是什么。

我的输入字符串是0246,诀窍是每个数字都可以是 2 个选项之一,例如:

[0,1][2,3][4,5][6,7]

我希望能够翻阅所有可能的组合,这有点像破解保险箱,但这不是目的,我保证!

我正在考虑做一个foreach循环来切换每个选项,但我的循环会被嵌套,我知道性能会受到影响,因为 Linq 就像新的黑色,可以使用它来完成吗?

更新*

我希望结果按从低到高的顺序返回,因为我正在比较的原始字符串可能是 0001,但随机跳转没有意义。

我还想跟踪我必须生成不同变体的次数,并注意它,因为它将在以后使用。

测试字符串中的所有可能性

你的意思是:

var allCombinations = from a in new[] { "0", "1", }
                      from b in new[] { "2", "3", }
                      from c in new[] { "4", "5", }
                      from d in new[] { "6", "7", }
                      select a + b + c + d;

或者更奇特地说:

var allCombinations = from a in "01"
                      from b in "23"
                      from c in "45"
                      from d in "67"
                      select string.Concat(a, b, c, d);

在后一个(花哨的)版本中abcdchar变量,string.Concat(a, b, c, d)也可以写成a.ToString() + b + c + d

这是一种适用于任意数量的输入的方法(将您的格式解析为 int[][] 后),使用 AggregateJoin

var data = new[]
{
    new[] { 0, 1 },
    new[] { 2, 3 },
    new[] { 4, 5 },
    new[] { 6, 7 },
};
var nums = data.Aggregate(new[] { "" }.AsEnumerable(),
        (agg, arr) => agg.Join(arr, x => 1, x => 1, (i, j) => i.ToString() + j));

输出:

0246 
0247 
0256 
0257 
0346 
0347 
0356 
0357 
1246 
1247 
1256 
1257 
1346 
1347 
1356 
1357 

它使用 LINQ,所以它可能不是有史以来最快的东西(对于我来说,这些数据仍然<1 毫秒),而且我如何使用具有固定联接值的 Join 有一些味道,所以它可能不是有史以来最好的事情,但是嘿 - 它有效。

我假设您实际上需要列出的所有值。如果您真正想做的只是查看该值是否与看起来像有效密码的内容匹配,那么像 Dmitry 的解决方案这样的正则表达式可能是要走的路。

要测试您拥有 im 内存的值,您不需要生成所有可能的值。生成完整的字符串并对其进行比较是完成这项工作的最糟糕的方法。

如果要控制压缩过程(计数操作),则不能使用任何内置方法(正则表达式或Linq)。您应该手动浏览字符串中的所有字符并检查它们。

public bool Test(string input, string[] possibleValues)
{
    int operationsCount = 0;
    if (input.Length != possibleValues.Length)
    {
        return false;
    }
    for (int i = 0; i < input.Length; i++)
    {
        bool found = false;
        for (int j = 0; j < possibleValues[i].Length; j++)
        {
            operationsCount++;
            if (input[i] == possibleValues[i][j])
            {
                found = true;
                break;
            }
        }
        if (!found)
        {
            Console.WriteLine("Value does not satisfies the condition. Number of operations: " + operationsCount);
            return false;
        }
    }
    Console.WriteLine("Value satisfies the condition. Number of operations: " + operationsCount);
    return true;
}
Test("0247", new string[] { "01", "23", "45", "67" });

最短的方法是可以使用正则表达式来检查输入字符串是否满足条件。正则表达式是为将字符串与特定模式匹配而构建的。此解决方案中唯一的问题:您无法确定进行了多少操作。

public bool Test(string input, string[] possibleValues)
{
    String pattern = GeneratePattern(possibleValues);
    bool result = Regex.IsMatch(input, pattern);
    if (!result)
        {
            Console.WriteLine("Value does not satisfies the condition.");
        }
    else
    {
        Console.WriteLine("Value satisfies the condition.");
    }
    return result;
}
private string GeneratePattern(string[] possibleValues)
{
    StringBuilder sb = new StringBuilder();
    sb.Append("^");
    foreach (var possibleValue in possibleValues)
    {
        sb.Append("[");
        sb.Append(possibleValue);
        sb.Append("]");
    }
    sb.Append("$");
    return sb.ToString();
}