zoukankan      html  css  js  c++  java
  • LeetCode395-至少有 K 个重复字符的最长子串

    题目链接:https://leetcode-cn.com/problems/longest-substring-with-at-least-k-repeating-characters

    public class LeetCode395 {
    
        public static void main(String[] args) {
            function_1("weitong",1);
            System.out.println("res="+res);
        }
        static int res=0;
        public static int longestSubstring(String s, int k) {
            res=0;
            function_1(s,k);
            return res;
        }
        public static void function_1(String s,int k){
            System.out.println("string="+s);
            //作为统计字母个数的数组
            int [] chars=new int[26];
            for (int i=0;i<chars.length;i++){
                chars[i]=0;
            }
            //首先字符串的长度要大于等于k
            if(s.length()<k){
                return;
            }
            //遍历统计字符串中字母a-z的个数
            for(int i=0;i<s.length();i++){
                chars[s.charAt(i)-'a']++;
            }
    
            System.out.println("统计结果:");
            //找到统计结果中,总数大于0,但小于k的字母
            Set<Integer> charsSet=new HashSet<>();//记录有那些字母个数是小于k的
            for(int i=0;i<chars.length;i++){
                if(chars[i]>0){
                    System.out.println((char)('a'+i)+":"+chars[i]);
                }
                if(chars[i]>0 && chars[i]<k){
                    System.out.println("个数小于k的字母:");
                    System.out.println((char)('a'+i)+":"+chars[i]);
                    charsSet.add(('a'+i));
                }
            }
            if(charsSet.size()==0){
                res=(s.length()>res? s.length():res);
                return;
            }
            //记录不需要的字母在字符串中的坐标
            List<Integer> indexList=new ArrayList<>();
            for(int i=0;i<s.length();i++){
                if(charsSet.contains(Integer.valueOf(s.charAt(i)))){
                    indexList.add(i);
                }
            }
            System.out.println("坐标位置:");
            for (Integer integer : indexList) {
                System.out.println(integer);
            }
            for(int i=0;i<indexList.size();i++){
                if(i==indexList.size()-1 && indexList.get(i)<s.length()-1){
                    function_1(s.substring(indexList.get(i)+1),k);
                }
                if(i==0){
                    if(indexList.get(i)-0>=k){
                        function_1(s.substring(0,indexList.get(i)),k);
                    }
                }else{
                    if((indexList.get(i)-indexList.get(i-1)-1)>=k){
                        function_1(s.substring(indexList.get(i-1)+1,indexList.get(i)),k);
                    }
                }
            }
        }
    }
    
  • 相关阅读:
    javaSE基础(六)--IO流
    javaSE基础(五)--JDBC
    javaSE基础(四)--Map集合
    javaSE基础(三)--List集合
    javaSE基础(二)
    javaSE基础(一)
    eclipse快捷键大全
    mybatis学习-基础
    工厂模式
    GC日志和jvm内存的分代
  • 原文地址:https://www.cnblogs.com/zhang-han/p/14920243.html
Copyright © 2011-2022 走看看