1. 程式人生 > 其它 >LeetCode395-至少有 K 個重複字元的最長子串

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);
                }
            }
        }
    }
}