LeetCode395-至少有 K 個重複字元的最長子串
阿新 • • 發佈:2021-06-22
題目連結: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); } } } } }