package com.bimoku.util.xml;
import java.util.ArrayList;
import java.util.List;
/**
*
* bcab
*
* bcab-->dab-->cb-->a
*
* bcab-->bbb
*
* bcab-->bcd-->ad-->c
*
* bcab-->bcd-->ba-->c
* @author Lee
*
*/
public class MinLength {
private final static String base = "abc";
public static void main(String[] args) {
//acbb//AABCCC
System.out.println(minLength("aabcbb"));
}
/**
* 逻辑处理主函数
* @param str
* @return
*/
private static int minLength(String str){
List<Integer> list = convert(str);
List<Integer> stack = new ArrayList<Integer>();
while (!list.isEmpty()) {
//从元序列中拿出一个元素放到待排序的序列
stack = fix(stack, list.remove(0));
}
System.out.println(stack);
return stack.size();
}
/**
* 用于维护已经最优的队列
* @param src
* @param news
* @return
*/
private static List<Integer> fix(List<Integer> src,Integer news){
//加到队列尾部
src.add(news);
//保证长度大于等于2
if(src.size() < 2)
return src;
if(!isEnd(src)) {
Integer newsData = src.remove(src.size()-1);
Integer lastData = src.remove(src.size()-1);
Integer temp = replace(newsData, lastData);
if(temp==0){
src.add(lastData);
src.add(newsData);
}else{
fix(src,temp);
}
}
//倒序处理
return src;
}
/**
* 终止符判断
* @param src
* @return
*/
private static boolean isEnd(List<Integer> src){
Object[] arr = src.toArray();
for(int a=0;a<arr.length-1;a++){
if(arr[a] != arr[a+1]){
return false;
}
}
return true;
}
/**
* 转换
* @param a
* @param b
* @return
*/
private static int replace(int a,int b){
if((a+b)%3 == 0)//1+2
return 3;
if((a+b)%2 == 0)//1+3
return 2;
if((a+b)%5 == 0)//2+3
return 1;
return 0;
}
/**
* 字符串转换成数字的数组
* @param str
* @return
*/
private static List<Integer> convert(String str){
List<Integer> list = new ArrayList<Integer>();
char[] arr = str.toCharArray();
for(int i=0;i<arr.length;i++){
list.add(mapping(arr[i]));
}
return list;
}
/**
* 映射关系
* @param a
* @return
*/
private static int mapping(char a){
int result = 0;
switch (a) {
case 'a':
result = 1;
break;
case 'b':
result = 2;
break;
case 'c':
result = 3;
break;
default:
result = 1;
break;
}
return result;
}
}