最长的指定瑕疵度的元音子串
解题思路
其实这道题就是典型的双指针问题,左边指针从字符串的左边0位置开始找,右边指针从字符串位置字符串长度减1的位置开始找。
1.以aabuuba为例,进入while循环,判断左边位置是否为元音,如果不是就是left++,进入下一次循环。
2.判断右边位置是否为元音,如果不是就right--,进入下一个循环。
3.如果左右都是元音,案例刚进入循环都是元音,这个时候就要注意了,这个时候不能单纯的left++,right--处理,因为如果left++。那么结果可能就是uuba,长度为4.这个结果是不对的,正确的结果是aabuu。
解决思路在下面具体代码中
代码
std::vector<char> VowelChars = { 'a','o','e','i','u' };
//判断当前字符是否为元音
bool IsVowel(char chr)
{
//转换为小写字母
chr=std::tolower(chr);
if (std::find(VowelChars.begin(), VowelChars.end(), chr) == VowelChars.end())
return false;
return true;
}
//获取瑕疵度
int GetDefectDeep(std::string& str)
{
int deep = 0;
for (auto c : str)
{
if (!IsVowel(c))
deep++;
}
return deep;
}
//获取最长指定瑕疵度的元音字符串长度
//str:原始字符串
//deep:指定的瑕疵度
int GetMaxVowelStringLenght(std::string& str, int deep)
{
//采用双指针的做法,左边从0开始,右边从尾部开始
int left = 0;
int right = str.length() - 1;
int max = 0;
while (right >= left)
{
if (!IsVowel(str[right]))
{
right--;
continue;
}
if (!IsVowel(str[left]))
{
left++;
continue;
}
//查询瑕疵度是否正确
std::string newString = str.substr(left, right - left+1);
if (GetDefectDeep(newString) != deep)
{
//从左往右
for (int i = left; i <= right; i++)
{
newString = str.substr(i, right - i + 1);
if (IsVowel(newString[0]) && GetDefectDeep(newString) == deep && right - i +1> max)
{
max = right - i+1;
}
}
//从右往左
for (int i = right; i >= left; i--)
{
newString = str.substr(left, i - left + 1);
if (IsVowel(newString[0]) && GetDefectDeep(newString) == deep && i - left +1 > max)
{
max = i - left+1;
}
}
right--;
left++;
}
else
{
if (right - left > max)
{
max = right - left;
}
break;
}
}
return max;
}
测试代码
写了两个测试函数,一个用来调试单个案例,另一个全面验证
//单个测试,一般用来调试代码
void DebugTest()
{
std::string str = "aabeebuu";
int deep = 1;
int result=GetMaxVowelStringLenght(str, deep);
std::cout << result << std::endl; //预期结果为 aabee eebuu
}
//全量测试,输入不同的案例,测试代码质量
void FullTest()
{
std::string str1 = "aabeebuu";
int deep1 = 1;
int result = GetMaxVowelStringLenght(str1, deep1);
std::cout << result << std::endl; //预期结果为5 aabee eebuu
str1= "asdbuiodevauufgh";
deep1 = 0;
result = GetMaxVowelStringLenght(str1, deep1); //满足最长元音字符子串有2个 uio auu 长度为3
std::cout << result << std::endl;
str1 = "aeueo";
deep1 = 2;
result = GetMaxVowelStringLenght(str1, deep1); //0
std::cout << result << std::endl;
}
主函数
void main()
{
//DebugTest();
FullTest();
}
结果
华为OD2024 E 文章被收录于专栏
实时更新华为2024 E卷答案
查看16道真题和解析