我需要能够处理一个或多个单词并验证它是否具有有效的音节。可以使用一些音节化规则:
V CV VC CVC CCV CCCV CVCC
其中V是元音,C是辅音。如,
pronunciation (5 Pro-nun-ci-a-tion; CCV-CVC-CV-V-CVC)
或者有一个可以使用的简单代码,还是c ++中的库?在课堂上我们讨论的是二叉搜索树,哈希表等,但我无法真正看到这种关系。感谢任何帮助。
答案 0 :(得分:3)
每当我们收集完整的模式字符串时,我们可以丢弃它并开始收集到新的模式字符串,或保留它并尝试获得更长的模式字符串。我们事先不知道(不检查输入字符串的其余部分),我们是否应该保留或丢弃当前字符串,因此我们需要牢记两种可能性。
我们可以构建一个可以为我们跟踪的状态机。基本状态由我们目前检查的字符序列标识:
State C V
"" {"C"} {"V",""}
"C" {"CC"} {"CV",""}
"CC" {"CCC"} {""}
"CCC" {} {""}
"CV" {"CVC",""} {}
"CVC" {""} {}
"V" {""} {}
由于我们并不总是知道要采取哪种行动,因此我们可以同时处于几种可能的状态。这些可能的状态形成超状态:
Index Super-state C V
0 {} 0 0 Fail
1 {""} 2 9 Accept
2 {"C"} 3 8
3 {"CC"} 4 1
4 {"CCC"} 0 1
5 {"","C"} 6 13 Accept
6 {"C","CC"} 7 8
7 {"CC","CCC"} 4 1
8 {"","CV"} 12 9 Accept
9 {"","V"} 5 9 Accept
10 {"","C","CC"} 11 13 Accept
11 {"C","CC","CCC"} 7 8
12 {"","C","CVC"} 10 13 Accept
13 {"","CV","V"} 12 9 Accept
过渡在超状态之间。超级州的每个成员都使用相同的符号进行推进。没有这种转变的所有成员都被丢弃。如果成员有两个可能的目的地,则两者都被添加到新的超级状态。
您可能会注意到某些行非常相似。超级状态3和7具有相同的转换。与6和11,以及8和13一样。您可以将它们分别折叠为一个状态,并更新索引。我不会在这里证明这一点。
这很容易编码成编程语言:
// index = 0 1 2 3 4 5 6 7 8 9 10 11 12 13
int[] consonant = new int[] { 0, 2, 3, 4, 0, 6, 7, 4, 12, 5, 11, 7, 10, 12 };
int[] vocal = new int[] { 0, 9, 8, 1, 1, 13, 8, 1, 9, 9, 13, 8, 13, 9 };
int[] accept = new int[] { 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1 };
int startState = 1;
int failState = 0;
bool CheckWord(string word)
{
int state = startState;
foreach (char c in word)
{
if (IsVocal(c))
{
state = vocal[state];
}
else if (IsConsonant(c))
{
state = consonant[state];
}
if (state == failState) return false;
}
return accept[state] != 0;
}
示例:强>
> CheckWord("pronunciation")
true
> CheckWord("pronunciationn")
false