• 5417.定长子串中元音的最大数目


    image-20200524152056530

    提示

    • 1 <= s.length <= 10^5
    • s 由小写英文字母组成
    • 1 <= k <= s.length

    思路

    • 如果k的长度大于等于s的长度,遍历s并统计元音数目,遍历完毕直接返回结果值
    • 如果k的长度小于s的长度,即定长的滑动窗口问题,用ans动态更新最大元音字符数,窗口向右滑动过程,细节如下:
      • 判断滑动前的左端点是否为元音字符
      • 滑动后的右端点是否为元音字符

    代码

    /*
     *12ms  
     */
    public int maxVowels(String s, int k) {
            int ans=0;
            if(k>=s.length()){
                for(char c:s.toCharArray()){
                    if(c=='a'||c=='e'||c=='i'||c=='o'||c=='u'){
                        ans++;
                    }
                }
                return ans;
            }else{
                int len=0;
                //预处理
                for(int i=0;i<k;i++){
                    char c=s.charAt(i);
                    if(c=='a'||c=='e'||c=='i'||c=='o'||c=='u'){
                        len++;
                    }
                }
                ans=len;
                for(int left=1,end=k;end<s.length();end++, left++){
                    char preLeft=s.charAt(left-1);
                    char c=s.charAt(end);
                    if(preLeft=='a'||preLeft=='e'||preLeft=='i'||preLeft=='o'||preLeft=='u'){
                        len--;
                    }
                    if(c=='a'||c=='e'||c=='i'||c=='o'||c=='u'){
                        len++;
                    }
                    ans=Math.max(ans, len);
    
                }
                return ans;
            }
        }
    

    优化

    • 整理 窗口移动 过程代码
    /*
     * 12ms
     */
    public int maxVoAnInt3(String s,int k){
            int  n=s.length(),ans=0,count=0;
            for(int i=0,j=0;j<n;j++){
                //右指针
                char c=s.charAt(j);
                if(c=='a'||c=='e'||c=='i'||c=='o'||c=='u'){
                    count++;
                }
                //当长度大于k时,左指针开始移动
                if(j>k-1){
                    //左指针
                    char c1=s.charAt(i);
                    if(c1=='a'||c1=='e'||c1=='i'||c1=='o'||c1=='u'){
                        count--;
                    }
                    i++;
                }
                ans=Math.max(ans, count);
            }
            return ans;
        }
    

    以上优化是参考以下代码,原文:Alex:Java双指针滑动窗口

       /**
         * 以"aeiou"为参照
         * 22ms
         */
        public int maxVowAnInt2(String s,int k){
            int n=s.length();
            int count=0,ans=0;
            int i=0;
            for(int j=0;j<n;j++){
                if("aeiou".indexOf(s.charAt(j))!=-1)count++;
                if(j>k-1){
                    if("aeiou".indexOf(s.charAt(i))!=-1) count--;
                    i++;
                }
                ans=Math.max(ans, count);
            }
            return ans;
        }
    
    	
    
  • 相关阅读:
    QT,QVector 基本用法,遍历[实例讲解]
    QT boolinq
    Qt532.QString_填充字符
    QT AES加密
    允许ubuntu下mysql远程连接
    Curl参数一览
    PHP实现http与https转化
    LINUX查看硬件配置命令
    使用.htaccess的时候服务器出现500错误(在配置后台时出现)
    64位win7旗舰版搭建apache+php+mysql开发环境
  • 原文地址:https://www.cnblogs.com/yh-simon/p/12951260.html
Copyright © 2020-2023  润新知