我看到题目的时候愣了一会,多看几遍才发现,是给定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; } }
很菜,很拉的题解~