如何将字符串分类为' good',' bad'和' mixed'基于元音和辅音的序列

时间:2017-03-04 20:09:51

标签: javascript string loops text-classification

我想将字符串分为三种类型:好,坏或混合。如果一个字符串有3个连续的元音或5个连续的辅音,或两者都有,那么它被归类为坏。否则它被归类为好。英语字母表中的元音是[" a"," e"," i"," o"," u&#34 ;]和所有其他字母都是辅音。

该字符串还可以包含字符?,可以用元音或辅音代替。这意味着字符串"?aa"如果?是元音,那么可能会很糟糕;如果它是辅音,则可能是好的。这种字符串被归类为混合字符串。

实现一个带有字符串s并返回其类别的函数:good,bad或mixed。

以下是我目前的代码:



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'
    }
  }
}
&#13;
&#13;
&#13;

有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:1)

定义两个正则表达式,一个用于混合,一个用于坏。

bad正则表达式只查找三个连续的元音或五个连续的辅音。 mixed正则表达式查找相同的内容,但使用前瞻(?=)以确保在接下来的三到五个字符中的某处有问号。

&#13;
&#13;
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)));
&#13;
&#13;
&#13;

答案 1 :(得分:-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分钟来完成这个,所以必须继续:(

希望这有帮助