题目
- 贪心算法思路如下:
1.不断取S的开头和末尾中较小的一个字符放到T的末尾
2.但是遇到S的开头和末尾相同的情况该如何解决呢?
3.在这种情况下,我们希望能够尽早使用更小的字符,所以就要比较下一个字符的大小。如果下一个字符也相等呢? 就有了如下的算法
4. 按照字典序比较S和将S反转后的字符S’
5. 如果S较小,就从S的开头取出一个文字,追加到T的末尾
6. 如果S’较小,就从S的末尾取出一个文字,追加到T的末尾
7. 如果相同,随便取那个都可以
代码如下:
package day03;
public class 字典序最小的问题 {
public static void main(String[] args) {
getMinDict("ACDBCB");
}
public static String getMinDict(String s){
int start = 0; //指向字符串的开始位置
int end = s.length()-1; //指向字符串的最后位置
char[] ss = s.toCharArray();
String t = "";
//如果start>=end 代表字符串扫描完毕
while (start<=end){
boolean left = false; //代表左边字符小 还是右边字符小
for (int i = 0; start+i<=end; i++) {
if(ss[start+i]<ss[end-i]){
left = true; //找到左边的比右边小,就立即退出循环
break;
}else if(ss[start+i]>ss[end-i]){
left = false;
break;
}
//如果相等就继续比较,直到找到一个小的字符.
}
if(left){
//将左边的字符添加到t
t+=ss[start];
start++;
}else {
//将右边的字符添加到t
t+=ss[end];
end--;
}
}
System.out.println(t);
return t;
}
}