2012-10-25 101 views
2

我需要能夠處理一個單詞或單詞並驗證它是否有有效的音節。有一些可以使用的音節規則:如何驗證一個單詞是否有有效的音節?

V CV VC CVC CCV CCCV CVCC 

其中V是元音,C是輔音。

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

或者是否有一個簡單的代碼可以使用,或在c + +中的庫?在課堂上,我們討論二叉搜索樹,散列表等,但我無法真正看到關係。任何幫助將不勝感激,謝謝。

+1

'親尼姑-Cl-A-灰; CV-CVC-CV-V-CVC'不應該是'Pro-nun-ci-a-tion; CCV-CVC-CV-V-CVC' – Nishant

+0

這可能有幫助:如果是'CCCV',第一個C只能是's',而最後一個C只能是'r'或'l'。在CCV的情況下,第一個C是's',或者第二個C是'r'或'l'。 (仔細檢查一下)。在'V'的情況下,我認爲只有前面的音節以'V'結尾時纔會出現。如果'C'不能屬於下一個音節(例如,如果它不是's'並且在它之後有另一個'C',它不是'r' '或'l')。也許有一些預見性的信件,你可以設計規則並一次找到音節。 – Shahbaz

+0

在英語中,儘可能多的輔音應該跟隨它們的元音分組,而不會產生不可能的分類。可以查看允許和禁止的輔音羣列表(@Shahbaz有一些規則,但不是全部)。難點在於確定輔音和元音的位置(即字母到聲音的轉換)。見例如[這裏](http://clas.mq.edu.au/phonetics/phonology/syllable/syll_phonotactic.html)。其他語言可能有完全不同的規則。 –

回答

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 
+0

中有意義的包括這個概念+1對於一個好的描述如何爲這個特定的正則表達式構建一個狀態機另請參考http://swtch.com/~rsc/regexp/regexp1.html瞭解如何在狀態機中實現正則表達式 –

+0

哇,這真是太好了。我在這工作。 –

相關問題