package com.bimoku.util.xml; import java.util.ArrayList; import java.util.List; public class Min { public static void main(String[] args) { Long t1 = System.currentTimeMillis(); String s = "aabcbbaaaaaaa"; System.out.println("string:"+s); System.out.println(minLength(s)); System.out.println("need time:"+(System.currentTimeMillis() - t1)); } /** * 处理方法 * @param s * @return */ public static int minLength(String s){ //边界值处理 int min = s.length(); if(min < 2) return 1; if(isEnd(s)) return s.length(); List<String> group = group(s); while (!group.isEmpty()) { String one = ""; String other = ""; one = group.remove(0); if(!group.isEmpty()) other = group.remove(0); //求出这条记录的最短路径就是三个中间最小的 min = Math.min(min,Math.min(minLength(one), minLength(other))); } return min; } /** * 一个字符串有多少种分组方式 * @param s * @return */ public static List<String> group(String s){ List<String> arr = new ArrayList<String>(); if(isEnd(s)){ arr.add(s); }else{ //开始做处理,非结束,则长度大于等于2 for(int a=2;a<=s.length();a++){ String head = s.substring(0, a-2); String nearTwo = s.substring(a-2, a); String tail = s.substring(a, s.length()); String temp = replace(nearTwo); if(temp != null && temp.length() == 1){ String newStr = head + temp + tail; arr.add(newStr); } } } return arr; } /** * 结束标志,字符串序列只出现一种类型的字母 * @param s * @return */ private static boolean isEnd(String s){ if(s.length() > 2 || s.length() == 2){ for(int a=1;a<s.length();a++){ if(s.charAt(a-1) != s.charAt(a)) return false; } } //长度小于2,直接结束 return true; } /** * 替换规则 * @param s * @return */ private static String replace(String s){ if(s == null || "".equals(s) || s.length() > 2 || isEnd(s)) return null; if(!s.contains("a")){ return "a"; } else if(!s.contains("b")){ return "b"; } else if(!s.contains("c")){ return "c"; } return null; } }