首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析字符串并在多个字符串中生成所有可能的组合

解析字符串并在多个字符串中生成所有可能的组合
EN

Stack Overflow用户
提问于 2014-01-28 11:43:03
回答 2查看 500关注 0票数 1

在我的Server数据库中,存储了表示问题的正确解决方案的字符串。在这个字符串中,可以使用某种格式来表示多个正确的解决方案。格式:

代码语言:javascript
复制
possible-text [posibility-1/posibility-2] possible-text

这说明可选性-1或可选性-2是正确的.有多少种可能性是没有限制的(例如pos-1 / pos-2 / pos-3 /.是可能的)。然而,一种可能性可以是无效的,例如:

代码语言:javascript
复制
I am [un/]certain.

这意味着答案可能是“我确定”或“我不确定”。格式也可以嵌套在句子中,例如:

代码语言:javascript
复制
I am [[un/]certain/[un/]sure].

这种格式也可以在一个句子中多次出现,例如:

代码语言:javascript
复制
[I am/I'm] [[un/]certain/[/un]sure].

我想要的是生成所有可能的组合。例如,上述表达式应返回:

代码语言:javascript
复制
I am uncertain.
I am certain.
I am sure.
I am unsure.
I'm uncertain.
I'm certain.
I'm sure.
I'm unsure.

筑巢是没有限制的,也没有多少可能性。如果只有一个可能的解决方案,那么它将不是以上述格式。我不知道该怎么做。

我必须用C#写这个。我认为一个可能的解决方案可能是编写一个regex表达式,该表达式可以捕获/格式并在列表中返回可能的解决方案(对于每个[]-pair),然后以堆栈式的方式(某种递归和回溯方式)遍历它们来生成可能的解决方案,但我还没有找到一个可行的解决方案。

我不知道这件事到底是怎么开始的。如果有人能给我一些关于如何解决这个问题的建议,我将不胜感激。当我发现什么东西的时候,我会在这里加上它。

注意:我注意到有很多类似的问题,但是所有的解决方案似乎都是针对特定的问题,我认为不适用于我的问题。如果我错了,你还记得之前回答过的一个问题,你能告诉我吗?提前谢谢。

更新:只是为了澄清是否不清楚。代码中的每一行都是可能的输入。整条线都是输入的:

代码语言:javascript
复制
[I am/I'm] [[un/]certain/[/un]sure].
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-28 12:32:47

这应该能行。我没有对其进行优化或进行错误检查(以防输入字符串格式错误)。

代码语言:javascript
复制
class Program
{
    static IEnumerable<string> Parts(string input, out int i)
    {
        var list = new List<string>();
        int level = 1, start = 1;
        i = 1;
        for (; i < input.Length && level > 0; i++)
        {
            if (input[i] == '[')
                level++;
            else if (input[i] == ']')
                level--;

            if (input[i] == '/' && level == 1 || input[i] == ']' && level == 0)
            {
                if (start == i)
                    list.Add(string.Empty);
                else
                    list.Add(input.Substring(start, i - start));
                start = i + 1;
            }
        }
        return list;
    }

    static IEnumerable<string> Combinations(string input, string current = "")
    {
        if (input == string.Empty)
        {
            if (current.Contains('['))
                return Combinations(current, string.Empty);
            return new List<string> { current };
        }
        else if (input[0] == '[')
        {
            int end;
            var parts = Parts(input, out end);
            return parts.SelectMany(x => Combinations(input.Substring(end, input.Length - end), current + x)).ToList();
        }
        else
            return Combinations(input.Substring(1, input.Length - 1), current + input[0]);
    }

    static void Main(string[] args)
    {
        string s = "[I am/I'm] [[un/]certain/[/un]sure].";
        var list = Combinations(s);
    }
}
票数 2
EN

Stack Overflow用户

发布于 2014-01-28 12:01:10

您应该创建一个解析器,该解析器逐个字符读取,并构建句子的逻辑树。当您有树时,很容易生成所有可能的组合。有几个可以使用的词法分析器,例如ANTLR:http://programming-pages.com/2012/06/28/antlr-with-c-a-simple-grammar/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21404730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档