我需要能够处理一个或多个单词并验证它是否具有有效的音节。有一些可以使用的音节规则:
V CV VC CVC CCV CCCV CVCC
其中V是元音,C是辅音。例如,
pronunciation (5 Pro-nun-ci-a-tion; CCV-CVC-CV-V-CVC)
或者有没有可以使用的简单代码,或者c++中的库?在课堂上,我们谈论的是二叉搜索树、哈希表等,但我看不出它们之间的关系。任何帮助将不胜感激,谢谢。
我需要能够处理一个或多个单词并验证它是否具有有效的音节。有一些可以使用的音节规则:
V CV VC CVC CCV CCCV CVCC
其中V是元音,C是辅音。例如,
pronunciation (5 Pro-nun-ci-a-tion; CCV-CVC-CV-V-CVC)
或者有没有可以使用的简单代码,或者c++中的库?在课堂上,我们谈论的是二叉搜索树、哈希表等,但我看不出它们之间的关系。任何帮助将不胜感激,谢谢。
每当我们收集到一个完整的模式串时,我们可以丢弃它并开始收集到一个新的模式串,或者保留它并尝试获得更长的模式串。我们事先不知道(不检查输入字符串的其余部分),我们应该保留还是丢弃当前字符串,因此我们需要牢记这两种可能性。
我们可以构建一个状态机来为我们跟踪这一点。基本状态是由我们迄今为止检查过的字符序列识别的:
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