我想将字符串分为三种类型:好、坏或混合。如果一个字符串有 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'
}
}
}
有人可以帮我吗?
定义两个正则表达式,一种用于混合,一种用于不良。
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)));
以下是可能的解决方案,分 3 个步骤:
[aeiou]{3}
或 5 个连续辅音 [^aeiou?]{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)));
这是一个“几乎”的答案
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 分钟,所以必须继续:(
希望这有帮助