【发布时间】:2019-04-03 08:53:27
【问题描述】:
我正在尝试根据正则表达式(也由用户给出)创建字母表中的单词序列(由用户给出)但无法做到。
示例场景 1:
Alphabet = [a,b,c]
Regex = (a+c)b*
Word Count = 6
Words = ["a", "c", "ab", "cb", "abb", "cbb"]
示例场景 2:
Alphabet = [a,b]
Regex = (a+b)*a
Word Count = 3
Words = ["a", "aa", "ba"]
我尝试将正则表达式转换为后缀/中缀,然后从那里开始,但无法构建引擎算法。
基本上有3个操作;
联合 (+)
连接 ()
闭包 (*)
我为每种运算符类型编写了一个函数;
void union(char* x[], char y)
{
printf("%s\n%c\n", x, y);
remainingWordCount -= 2;
}
void concat(char* x[], char* y[])
{
printf("%s%s\n", x, y);
remainingWordCount--;
}
void closure(char* x[], char* y[])
{
while (remainingWordCount > 0)
{
concat(x, y);
}
}
它只适用于大多数基本场景。
所以我的问题是如何在不使用任何正则表达式库的情况下根据给定的正则表达式创建字符串集?有没有已知的算法?
【问题讨论】:
-
您的语法有点混乱(您所说的
Language实际上是字母表):(a+c)直观上是ac或a(a*)c,但您似乎将其用作(a|c). -
@Arkku 感谢您的反馈。将语言更改为字母。是的,我猜运营商与标准有所不同。
-
你应该生成无限字符串中的哪一个?
count最短的?按字母顺序排列的第一个count字符串?任何count字符串?count字符串的统一随机样本?当请求为五个时,您的第一个示例显示六个字符串,因此它使问题悬而未决... -
@Arkku:使用“+”表示交替实际上是计算机科学的标准。
-
在您的第一个示例中,按字母顺序排列的前 5 个字符串是
a、ab、abb、abbb、abbbb。 (按字母顺序,您永远不会产生以c开头的字符串。)这不会使标准不正确;它只是表明需要一个精确的规范。
标签: c regex automata fsm computation