2017-03-04 24 views
-5

我想串歸類爲三種元音的序列和「混合」:好的,壞的,或混合。如果一個字符串有3個連續的元音或者5個連續的輔音,或者兩者都有,那麼它被歸類爲不合格。否則它被分類爲好。英文字母中的元音是[「a」,「e」,「i」,「o」,「u」],其他所有字母都是輔音。如何分類字符串作爲「好」,「壞」,並根據輔音

該字符串也可以包含字符?,這可以通過一個元音或輔音代替。這意味着如果?是元音字符串,「?aa」字符串可能很糟糕,如果是輔音字符串,則字符串可能很糟糕。這種字符串被分類爲混合。

實現一個功能,需要一個字符串s,並返回其類別:好的,壞的,或混合。

下面是當前的代碼,我有:

function classifyStrings(s) { 
 
    if (s.includes('?')) return 'mixed'; 
 

 
    for (var i = 0; i < s.length; i++) { 
 
    if (s[i].match(/[aeiou]/gi) && s[i + 1].match(/[aeiou]/gi) && s[i + 2].match(/[aeiou]/gi)) { 
 
     return 'bad' 
 
    } else { 
 
     return 'good' 
 
    } 
 
    } 
 
}

是否有人可以幫助我?

+2

聽起來像是你試圖讓別人來解決你的考試。 – Janne

+0

作爲一種協助,通過regEx,您可以使用類似這樣的構造/ [aeiou] {3,}/gi來確定連續是否至少有三個元音。我會推薦[本站](https://regex101.com/)更好地熟悉regEx及其許多方面(雖然有許多好的方面)。 – rasmeister

+0

@rasmeister我試過你的解決方案,但下面的代碼似乎並不工作。你知道爲什麼? 如果(S [I] .match(/ [AEIOU] {3} /))返回 '壞' – Tae

回答

-1

這裏有一個 '幾乎' 回答

function isVowel(s){ 
 
    return s=="a" || s=="i" || s=="o" || s=="u" || s=="e"; 
 
} 
 

 
var inputs = ["aaa","aab","aabbbbb","aa?bbbb","?aa", "bbaa?"] 
 
//    bad good bad  bad  mixed mixed 
 
for(var i=0;i<inputs.length;i++){ 
 
    var letters = inputs[i].split(""); 
 
    var vcount = 0; ccount = 0; 
 
    var mixed = false; 
 
    for(var j=0;j<letters.length;j++){ 
 
    if(isVowel(letters[j])){ 
 
     ccount=0; 
 
     vcount++; 
 
    }else if(letters[j]=="?"){ 
 
     mixed = true; 
 
    }else{ 
 
     vcount=0; 
 
     ccount++; 
 
    } 
 
    } 
 
    if(mixed){ 
 
    var possibilities = ["ifVowel","ifConsonant"]; 
 
    var outcome = []; 
 
    for(var p=0; p<possibilities.length; p++){ 
 
     var tvcount = 0; tccount = 0; 
 
     for(var l=0; l<letters.length;l++){ 
 
     if(isVowel(letters[l])){ 
 
      if(tccount!=5) tccount=0; 
 
      tvcount++; 
 
     }else if(letters[l]=="?"){ 
 
      if(possibilities[p]=="ifVowel"){ 
 
      if(tccount!=5) tccount=0; 
 
      tvcount++; 
 
      }else { 
 
      if(tvcount!=3) tvcount=0; 
 
      tccount++; 
 
      } 
 
     }else{ 
 
      if(tvcount!=3) tvcount=0; 
 
      tccount++; 
 
     } 
 
     } 
 
     if(tvcount==3 || tccount==5){ 
 
     outcome.push("bad"); 
 
     }else{ 
 
     outcome.push("good"); 
 
     } 
 
    } 
 
    if(outcome[0]!=outcome[1]) console.log("mixed"); 
 
    else console.log(outcome[1]); 
 
    }else{ 
 
    if(vcount==3 || ccount==5) console.log("bad"); 
 
    else console.log("good"); 
 
    } 
 
}

然而,這種失敗,如果有一個以上的 「?」。或許可以用遞歸解決這個問題,但已經花了30分鐘就這一個,所以必須在:(

移動希望這有助於

+0

不應該'aa?bbbb'被「混合」? – 2017-03-05 03:26:24

+0

@torazaburo不可以,因爲兩種可能性都會導致錯誤 – IsuruKusumal

1

定義兩個正則表達式,一個用於混合和一個壞。

bad正則表達式只是看起來連續三個元音或連續五個輔音。該mixed正則表達式查找同樣的事情,但使用先行(?=),以確保有一個問號在未來三個或五個字符之內的某個地方。

const bad = /[aeiou]{3}|[^aeiou?]{5}/; 
 
const mixed = /(?=.{0,2}\?)[aeiou?]{3}|(?=.{0,4}\?)[^aeiou]{5}/; 
 

 
function classify(s) { 
 
    return bad.test(s) ? "bad" : mixed.test(s) ? "mixed" : "good"; 
 
} 
 

 
['abcde', 'aeibbb', 'xxaa?s', 'aavwxy?aa', 'abcdfga', 'aa?bbbb'].forEach(s => 
 
    console.log(s, classify(s)));

+0

對於aa?bbbb' – IsuruKusumal

+0

,這不合格?它現在爲'aa?bbbb'返回'mixed' ,我認爲這是正確的,因爲沒有「壞」 「子字符串,只有」混合「子字符串」。如果您不同意,請詢問OP。 – 2017-03-05 03:35:21

+0

鑑於「?」的可能值可以是元音或輔音。所以對於給定的輸入「aa?bbbb「它可能是」aaabbbb「或」aabbbbb「,都是不好的。 – everlasto

相關問題