如何根据元音和辅音的序列将字符串分类为“好”、“坏”和“混合”

问题描述 投票:0回答:3

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

字符串还可以包含字符

?
,该字符可以替换为元音或辅音。这意味着如果
?
是元音,则字符串“?aa”可能是坏的;如果是辅音,则字符串“?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'
    }
  }
}

有人可以帮我吗?

javascript string loops text-classification
3个回答
3
投票

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

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
投票

以下是可能的解决方案,分 3 个步骤:

  1. 识别坏字符串。 该行检查字符串 s 是否具有 3 个连续元音
    [aeiou]{3}
    或 5 个连续辅音
    [^aeiou?]{5}
    。如果满足其中任何一个条件,则该字符串被归类为坏字符串。
  2. 在字符串中处理
    '?'
    本质上,这个解决方案采用了递归的方法。当它遇到
    ?
    时,它会通过替换
    ?
    然后重新评估字符串来探索两种可能性(元音和辅音)。如果两种可能性导致相同的结果,则返回该结果;否则,它返回混合。
  3. 识别好的字符串。 如果以上两个条件都不满足,则表示该字符串没有 3 个连续的元音或 5 个连续的辅音或
    ?
    。因此,它被归类为良好。

function classifyStrings(s) {
//1. Identifying Bad Strings:
  if(s.match(/[aeiou]{3}/) || s.match(/[^aeiou?]{5}/)) return 'bad';
  
//2. Handling '?' in Strings:        
  if(s.match(/\?/)){
    var a=classifyStrings(s.replace(/\?/, 'a'));
    var b=classifyStrings(s.replace(/\?/, 'b'));        
    if(a==b) return a
    return 'mixed'
  }
  
//3. Identifying Good Strings:
  return 'good'
}

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


-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 分钟,所以必须继续:(

希望这有帮助

© www.soinside.com 2019 - 2024. All rights reserved.