题目

开头和结尾都是元音字母(aeiouAEIOU)的字符串为 元音字符串 ,其中混杂的非元音字母数量为其 瑕疵度 。比如:
· “a” 、 “aa”是元音字符串,其瑕疵度都为0
· “aiur”不是元音字符串(结尾不是元音字符)
· “abira”是元音字符串,其瑕疵度为2

现给定一个字符串,请找出指定瑕疵度的最长元音字符子串,并输出其长度,如果找不到满足条件的元音字符子串,输出0。
子串:字符串中任意个连续的字符组成的子序列称为该字符串的子串。

输入输出

输入描述:
首行输入是一个整数,表示预期的瑕疵度flaw,取值范围[0, 65535]。
接下来一行是一个仅由字符a-z和A-Z组成的字符串,字符串长度(0, 65535]。
输出描述:
输出为一个整数,代表满足条件的元音字符子串的长度。

示例

示例1
输入
0
asdbuiodevauufgh
输出
3
说明
满足条件的最长元音字符子串有两个,分别为uio和auu,长度为3。示例2
输入
2
aeueo
输出
0
说明
没有满足条件的元音字符子串,输出0
示例3
输入
1
aabeebuu
输出
5
说明
满足条件的最长元音字符子串有两个,分别为aabee和eebuu,长度为5

解题思路

一般思考这种字串之类的题目,都可以从最少遍历次数的角度去考虑最优解。多次的冗余计算并不是我追求的目标。

在这道题目中,有这样一种思路是满足要求的。两个指针fp,bp,都从头开始,fp先找到指定的flaw个瑕疵字符,接着向后找到最后一个元音字符。此时fp,bp锁囊括的就是一个解。接着,两个指针同时向后遍历,找到所有满足的字符串。这样算下来,只需要遍历两次,就可以完全算出来。

这样可以实现,但是,我又想到了更好的方法。

idea:假定元音字符是A类字符,非元音字符为B类字符,同类型的具体是什么字符是不是没有关系。所以,我们可以将同类字符合并。如 aabeebuu 就可以用 {2,1,2,1,2}的数组去保存。我们的目的,也变为了,找到这个数组中连续几个数值的最大,且下标为奇数的和等于flaw。

下面上代码。

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <numeric>bool is_aeiou(char c) {static std::string aeiou = "aeiouAEIOU";return std::string::npos != aeiou.find(c);
}int find_max_length(const std::string & str, int flaw) {if (str.size() == 0)return 0;std::vector<int> sums;bool tmp = true;    // 第一个字符一定是元音字符,输入已保证int k = 0;for (auto c : str) {if (tmp == is_aeiou(c)) {k++;} else {sums.push_back(k);tmp = is_aeiou(c);k = 1;}}sums.push_back(k);int head = 0;int tail = 0;int tt = 0;int length = 0;while (tail < sums.size() - 1) {// 特殊情况:tail已经为最后一个while (tt < flaw && tail < sums.size() - 1) {tail += 2;tt += sums[tail-1];}while (tt > flaw) {head += 2;tt -= sums[head-1];}// 特殊情况,flaw为0,对比所有元音串的长度if (flaw == 0) {length = length > sums[tail] ? length : sums[tail];tail += 2;if (tail == tail < sums.size() - 1)length = length > sums[tail] ? length : sums[tail];}// 先加后减,只有正好的时候,才纳入计算else if (tt == flaw) {int ss = (std::accumulate(sums.begin() + head, sums.begin() + tail + 1, 0));length = length > ss ? length : ss;head += 2;tt -= sums[head-1];}}return length;
}int main()
{// std::cout << find_max_length("asdbuiodevauufgh", 0) << std::endl;// std::cout << find_max_length("aeueo", 2) << std::endl;std::cout << find_max_length("aabeebuu", 1) << std::endl;
}

最长的指定瑕疵度的元音字串 —— 最优解法(C++实现)相关推荐

  1. 最长的指定瑕疵度的元音字串

    标题:最长的指定瑕疵度的元音子串 | 时间限制:1秒 | 内存限制:262144K | 语言限制:不限 开头和结尾都是元音字母(aeiouAEIOU)的字符串为 元音字符串 ,其中混杂的非元音字母数量 ...

  2. 算法题-双指针(最长的指定瑕疵度的元音子串(答案、解析))

    目录 题目 最长的指定瑕疵度的元音子串 题目描述 解答要求 答案 解析 核心思想 题目 注意要选好先判断左指针还是右指针可以节省不必要的操作. 最长的指定瑕疵度的元音子串 hash算法.双指针 题目描 ...

  3. 华为机试:最长的指定瑕疵度的元音子串

    题目来源 华为机试:最长的指定瑕疵度的元音子串 题目描述 题目解析 滑动窗口太容易出错了 我们把它想象成一个队列,无脑往queue中塞元素,并且记录非元音的个数,当非元音的个数等于flow个时,记录最 ...

  4. 无法删除 U 盘中文件,并提示“指定的文件名无效或太长 请指定另一个文件名”

    错误描述: 在删除 U 盘文件夹.文件时,无法删除,并提示 "指定的文件名无效或太长 请指定另一个文件名" 即使使用 360 文件粉碎器都无法删除 解决方法: 将 U 盘在 Mac ...

  5. 字符串相关处理kmp,前缀数,后缀树,后缀数组,最长回文串,最长重复字串,最长非重复字串

    1. 最长回文串 一般用后缀数组或者后缀树可以解决, 用此方法:http://blog.csdn.net/v_july_v/article/details/6897097 预处理后缀树,使得查询LCA ...

  6. php无重复字符的最长子串,无重复字符的最长字串问题

    leetcode3:无重复字符的最长字串问题 问题描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释 ...

  7. LC3无重复最长字串

    链接:无重复最长字串 步骤: 定义两个指针i,j 表示当前扫描到的字串是[i,j] (闭区间)扫描过程中维护一个哈希表unordered_map<char,int> hash 表示[i, ...

  8. LeetCode中等题之无重复字符的最长字串

    题目 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 &q ...

  9. 最长公共子序列(LCS)问题 Longest Common Subsequence 与最长公告字串 longest common substr...

    问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X="x0,x1,-,xm-1",序列Y=& ...

  10. 算法--无重复字符的最长字串(详细)

    给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度 class Solution {public int lengthOfLongestSubstring(String s) {// ...

最新文章

  1. 华谊兄弟出现什么问题_曾经的影视龙头一哥华谊兄弟,为什么如今混得那么惨?...
  2. 硬件信息统计_读取输出Excel_显示进度
  3. java关机命令收集cmd关机命令
  4. 51单片机扩展io口实验c语言,【51单片机】普通I/O口模拟SPI口C语言程序
  5. codevs 5966 [SDOI2017]硬币游戏
  6. Visio—如何画虚线?
  7. MASM6.11安装
  8. Django REST framework 中文文档
  9. Oracle VM VirtualBox虚拟机安装Windows XP系统,在xp中多核cpu不识别问题
  10. 【运营数据分析】运营数据分析怎么做?建立运营数据分析思维
  11. 面试题目之:为什么选择veu?与其他框架对比的优势和劣势?
  12. php dingo和jwt,三、Laravel5.4+Dingo+JWT 开发API
  13. 互联网快讯:多地要求商家下架槟榔;多所高校延长专硕学制至3年
  14. C# Socket网络编程精华篇 (转)
  15. MySQL redo log 重做日志 原理 Oracle Redo Log 机制 小结
  16. 180/360度舵机控制方法
  17. iOS开发简历这样写,面试电话接到手软
  18. 类似微信群聊九宫格头像的算法实现
  19. MySQL入门笔记(五):另存数据为文件(导出数据)
  20. Intention Oriented Image Captions with Guiding Objects

热门文章

  1. UFS和eMMC简介与区别
  2. 【NLP】Seq2Seq与Attention(Neural Machine Translation by Jointly Learning to Align and Translate)回顾
  3. IE 不兼容 justify-content:space-evenly 的解决办法
  4. C#中操作Excel(4)—— 向Excel中插入两种图表以及设置图表格式
  5. HTML Table 表格斜线
  6. 网络编程--探讨一些边界条件
  7. 进程系列(三)-进程的基本用法(打开文件示列)
  8. 嵌入式技术学习路线分享
  9. 易语言调用大漠Ocr文字识别游戏角色坐标
  10. Py之shap:shap.explainers.shap_values函数的简介、解读(shap_values[1]索引为1的原因)、使用方法之详细攻略