Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何验证一个单词是否有有效的音节?_Algorithm - Fatal编程技术网

Algorithm 如何验证一个单词是否有有效的音节?

Algorithm 如何验证一个单词是否有有效的音节?,algorithm,Algorithm,我需要能够处理一个或多个单词,并验证它是否有有效的音节。可以使用一些音节规则: V CV VC CVC CCV CCCV CVCC 其中V是元音,C是辅音。e、 g pronunciation (5 Pro-nun-ci-a-tion; CCV-CVC-CV-V-CVC) 或者有一个简单的代码可以使用,或者是C++中的一个库?在课堂上,我们讨论的是二进制搜索树、哈希表等,但我看不出它们之间的关系。任何帮助都将不胜感激。每当我们收集完整的模式字符串时,我们可以放弃它并开始收集新的模式字符串,或

我需要能够处理一个或多个单词,并验证它是否有有效的音节。可以使用一些音节规则:

V CV VC CVC CCV CCCV CVCC
其中V是元音,C是辅音。e、 g

pronunciation (5 Pro-nun-ci-a-tion; CCV-CVC-CV-V-CVC)

或者有一个简单的代码可以使用,或者是C++中的一个库?在课堂上,我们讨论的是二进制搜索树、哈希表等,但我看不出它们之间的关系。任何帮助都将不胜感激。

每当我们收集完整的模式字符串时,我们可以放弃它并开始收集新的模式字符串,或者保留它并尝试获取更长的模式字符串。我们事先不知道(不检查输入字符串的其余部分)是否应该保留或丢弃当前字符串,因此我们需要记住这两种可能性

我们可以建立一个状态机来跟踪这一点。基态由我们迄今为止检查过的字符序列确定:

状态C V
{“C”}{“V”,}
“C”{“CC”}{“CV”,“”
“CC”{“CCC”}{”“}
“CCC”{}{”“}
“CV”{“CVC”,“}{}”
“CVC”{”“}{}
“V”{“}{}
由于我们并不总是知道该采取哪种行动,我们可能同时处于几种可能的状态。这些可能的状态集形成超级状态:

索引超级状态C V
0{}0 0失败
1{“}2 9接受
2{“C”}3 8
3{“CC”}4 1
4{“CCC”}01
5{“C”}6 13接受
6{“C”,“CC”}7 8
7{“CC”、“CCC”}4 1
8{“CV”}12 9接受
9{“V”}5 9接受
10{“C”、“CC”}11 13接受
11{“C”、“CC”、“CCC”}7 8
12{“C”、“CVC”}10 13接受
13{“CV”、“V”}12 9接受
过渡是在超级状态之间进行的。超级国家的每一个成员都有相同的标志。没有这种转换的所有成员都将被丢弃。如果一个成员有两个可能的目的地,则这两个目的地都将添加到新的超级状态

您可能会注意到有些行非常相似。超级状态3和7具有相同的转换。第6条和第11条、第8条和第13条也是如此。您可以将它们分别折叠为一种状态,并更新索引。我不打算在这里证明这一点

这可以很容易地编码到编程语言中:

//索引=01234567891011213
int[]辅音=新的int[]{0,2,3,4,0,6,7,4,12,5,11,7,10,12};
int[]vocal=newint[]{0,9,8,1,1,13,8,1,9,9,13,8,13,9};
int[]accept=newint[]{0,1,0,0,0,1,0,0,1,1,1,0,1,1};
int startState=1;
int failState=0;
布尔校验字(字符串字)
{
int状态=开始状态;
foreach(word中的字符c)
{
if(IsVocal(c))
{
状态=声音[状态];
}
else if(IsConsonant(c))
{
状态=辅音[状态];
}
if(state==failState)返回false;
}
返回接受[状态]!=0;
}
示例:

>校验字(“发音”)
真的
>校验字(“发音”)
假的

Pro-nun-ci-a-tion;CV-CVC-CV-V-CVC
不应是
专业术语;CCV-CVC-CV-V-CVC
这可能会有所帮助:在
CCCV
的情况下,第一个C只能是
s
,而最后一个C只能是
r
l
。在CCV的情况下,第一个C是
s
,或者第二个C是
r
或者
l
。(再次检查此项)。在
V
的情况下,我认为它只有在前一个音节以
V
结尾时才会出现。如果
C
不能属于下一个音节(例如,如果它不是
s
,后面还有另一个
C
,不是
r
l
),则以
C
结尾的音节可能会取
C
。也许通过几个字母的“向前看”,你就可以设计出规则,一次就可以找到音节。在英语中,尽可能多的辅音应该与它们后面的元音组合在一起,而不会产生不可能的组合。可以查找允许和禁止的辅音串列表(@Shahbaz有一些规则,但不是全部)。难点在于确定辅音和元音的位置(即字母到声音的转换)。见例。其他语言可能有完全不同的规则。考虑到上下文,“在课堂上我们是……”,我怀疑这是一个学术练习。单词发音将由字符串“CCVCVCVVC”表示,该字符串将被解析为子字符串,从一个集合转换为CCV-CVC-CV-V-CVVC,而不考虑实际的辅音和元音是什么。如果是这样的话,shri和ztzu将是同样有效的CCCV模式。换言之,我将问题解释为正则表达式“^((V)|(CV)|(VC)|(CVC)|(CCV)|(CCCV)|(CVCC))*$”是否与输入匹配,例如“ccvcvvcc”"? 如果是这样的话,你就可以给出一个可能的解决方法。我认为没有有效音节的概念,就像没有详尽的列举就无法定义有效的英语单词一样。因此,正如@A.Webb所建议的,这很可能是一个练习,其中有效性的概念可能是以某种简化的方式定义的,在这种情况下,将该概念包括在问题+1中是有意义的,以便更好地描述如何为这个特定正则表达式构建状态机。有关如何在状态机中实现正则表达式的一般信息,请参见。