# 声明
个人原创,如有错误和不足,敬请指正,转载请注明出处
题目描述
定义:开头和结尾都是元音字母(aeiouAEIOU)的字符串为元音字符串,其中混杂的非元音字母数量为瑕疵度。比如:
- “a”、“aa”是元音字符串,其瑕疵度都为0
- “aiur”不是元音字符串(结尾不是元音字符)
- “abira”是元音字符串,其瑕疵度为2
给定一个字符串,请找出指定瑕疵度的最长元音字符子串,并输出其长度,如果找不到满足条件的元音字符子串,输出0.
子串:字符串中任意个连续的字符组成的子序列称为该字符串的子串
解答要求
时间限制:1000ms,内存限制:256MB
输入
首行输入是一个整数,表示预期的瑕疵度flaw,取值范围[0,65535]。
接下来一行是一个仅由字符a-z和A-Z组成的字符串,字符串长度(0,65535]。
输出
输出为一个整数,代表满足条件的元音字符子串的长度。
样例
输入
0 asdbuiodevauufgh
输出 3
提示 :满足条件的最长元音字符子串有两个,分别为uio和auu,长度为3。
输入
2 aeueo
输出 0
提示 : 没有满足条件的元音字符子串,输出0.
输入
1 aabeebuu
输出 5
提示 满足条件的最长元音字符子串有两个,分别为aabee和eebuu,长度为5
解题思路:为了简便,只考虑小写字母,需分缺陷数为0和不为0两种情况,方便处理边界问题,具体思路如下:
用双指针遍历字符串
* 参数说明 max为符合条件的最长元音字符串,flaw为要求的缺陷数
* 第0步: 如果缺陷字符数要求为0;则特殊处理,一旦碰到非元音字符,则计算当前元音字符串长度并更新max,否则进入第1步:
* 第1步:找到第一个元音字符,记录位置p,首先令i=p,j = p+1,curFlaw = 0开始遍历
* 第2步:移动j,
* 2.1 直到满足curFlaw = flaw,每找到一个缺陷字符则将curFlaw加一 ,且当前字符为元音字符,此时如果后面依旧是元音字符,继续移动j直到后面一个字符不是元音字符位置,或者到了尾部,记录此时字符串长度,并更新最大长度
* 2.2 直到满足curFlaw = flaw ,但当前字符依旧为缺陷字符,此时curFlaw > flaw,继续移动j,直到找到第一个元音字符,或者到了末尾(这种情况直接结束遍历)
* 3. 将i向右移动,直到找到第一个缺陷字符,并找到后面第一个元音字符,curFlaw-- ;
* 3.1 如果满足curFlaw < flaw,重复第2步
* 3.2 如果满足curFlaw == flaw,记录此时字符串长度,并更新最大长度
* 3.3 如果满足curFlaw > flaw, 重复第3步
* 3.4 如果i==j 则回到第2步
最后贴上代码
/**
* 思路:用双指针遍历字符串
* max为符合条件的最长元音字符串
*
* 0 如果缺陷字符数要求为0;则特殊处理,一旦碰到非元音字符,则计算当前元音字符串长度并更新max
* 否则:
* 1.找到第一个元音字符,记录位置p,首先令i=p,j = p+1,curFlaw = 0开始遍历
* 2.移动j,
* 2.1 直到满足curFlaw = flaw,每找到一个缺陷字符则将curFlaw加一 ,且当前字符为元音字符,此时如果后面依旧是元音字符,继续移动j直到后面一个字符不是元音字符位置,或者到了尾部,记录此时字符串长度,并更新最大长度
* 2.2 直到满足curFlaw = flaw ,但当前字符依旧为缺陷字符,此时curFlaw > flaw,继续移动j,直到找到第一个元音字符,或者到了末尾(这种情况直接结束遍历)
* 3. 将i向右移动,直到找到第一个缺陷字符,并找到后面第一个元音字符,curFlaw-- ;
* 3.1 如果满足curFlaw < flaw,重复第2步
* 3.2 如果满足curFlaw == flaw,记录此时字符串长度,并更新最大长度
* 3.3 如果满足curFlaw > flaw, 重复第3步
* 3.4 如果i==j 则回到第2步
*
* **/
function getFlawStr(str,flaw) {
let i =0, j=0, curFlaw = 0;
let max = 0;
let res = [];
for(let k=0;k<str.length;k++) {
if(map[str[i]]) {
i=k;j=k+1;
break;
}
}
if(flaw == 0) {
let k = 0;
while(k < str.length) {
if(!map[str[k]]) {
let len = k-i;
if(len > max) {
max = len;
res.push(str.slice(i,k))
};
k++;
i=k;
}else {
k++;
}
}
console.log(max,res,'max '+flaw);
return max;
}
while(j< str.length) {
if(!map[str[j]]) {
curFlaw += 1;
j++;
continue;
}else if(map[str[j+1]]){
j++;
continue;
}else {
if(curFlaw < flaw) {
j++;
continue;
}
if(curFlaw == flaw) {
let len = j-i+1;
if(len > max) {
max = len;
res.push(str.slice(i,j+1))
};
}
i++;
while(i!=j) {
if(!map[str[i]]) {
curFlaw--;
i++;
continue;
}else if(map[str[i+1]]) {
i++;
continue;
}else {
if(curFlaw < flaw) {
break;
}else if(curFlaw == flaw) {
let len = j-i+1;
if(len > max) {
max = len;
res.push(str.slice(i,j+1))
};
i++;
}else {
i++;
}
}
}
j++;
}
}
console.log(max,res,'max '+flaw);
return max;
}
var flaw = 1;
var str = 'asdbuiodevauufgh';
var map = {
a: 1,
e: 1,
i: 1,
o: 1,
u: 1
}
getFlawStr(str,flaw);
flaw = 0;
getFlawStr(str,flaw);
flaw = 3;
getFlawStr(str,flaw);