我看到题目的时候愣了一会,多看几遍才发现,是给定abc的值,让你往字符串里面添加a,b,c三个字符,三个字符不能为连续的三个。
根据提示一,我们知道是要尽可能长,那么看到这种要求,那么我就选择使用贪心来解决这个问题。
贪心的思路是:
每次选三个字母数字最大的那一个,这样长+长+短+长+长,是字符串尽可能长的核心。
如果已经是长+长了,现在还是长的那个数字是最大的,那么我们依次向下选择第二长的,如果第二长的数字是0,那么就第三长,如果连第三长都是0,那么就直接结束循环。
class Solution {
public String longestDiverseString(int a, int b, int c) {
String str = "";
char ch[] = {'a','b','c'};
while(true){
//a最大的情况
if(a>=b && a>=c){
//先判断前两位不能是aa
if(str.length()>=2 && str.substring(str.length()-2,str.length()).equals("aa")){
//如果前两位是aa了,就找第二大的
if(b>c && b!=0){
//第二大不能为0,如果为0,那么也就是第二大和第三大都是零,已经是最长的快乐字符串了
str += ch[1];
b--;
}else if(c!=0){
str += ch[2];
c--;
}else{
//至于这里为什么是使用a--,来让他自己达到结束循环的条件判断呢?
//因为我发现这里使用break;来结束循环,好像执行用时更多?
//不过我这题解本来就差了,break和自减随意就好~
a--;
}
}else{
str += ch[0];
a--;
}
}
//额外判断,当abc都为零,就结束循环
if(a==0&&b==0&&c==0){
break;
}
//b最大的情况
if(b>=a && b>=c){
//先判断前两位不能是bb
if(str.length()>=2 && str.substring(str.length()-2,str.length()).equals("bb")){
//如果前两位是aa了,就找第二大的
if(a>c && a!=0){
//第二大不能为0,如果为0,那么也就是第二大和第三大都是零,已经是最长的快乐字符串了
str += ch[0];
a--;
}else if(c!=0){
str += ch[2];
c--;
}else{
b--;
}
}else{
str += ch[1];
b--;
}
}
//额外判断,当abc都为零,就结束循环
if(a==0&&b==0&&c==0){
break;
}
//c最大的情况
if(c>=b && c>=a){
//先判断前两位不能是cc
if(str.length()>=2 && str.substring(str.length()-2,str.length()).equals("cc")){
//如果前两位是aa了,就找第二大的
if(a>b && a!=0){
//第二大不能为0,如果为0,那么也就是第二大和第三大都是零,已经是最长的快乐字符串了
str += ch[0];
a--;
}else if(b!=0){
str += ch[1];
b--;
}else{
c--;
}
}else{
str += ch[2];
c--;
}
}
//额外判断,当abc都为零,就结束循环
if(a==0&&b==0&&c==0){
break;
}
}
return str;
}
}
很菜,很拉的题解~