如果字符串中不含有任何 ‘aaa’,‘bbb’ 或 ‘ccc’ 这样的字符串作为子串,那么该字符串就是一个「快乐字符串」。
给你三个整数 a,b ,c,请你返回 任意一个 满足下列全部条件的字符串 s:
s 是一个尽可能长的快乐字符串。
s 中 最多 有a 个字母 ‘a’、b 个字母 ‘b’、c 个字母 ‘c’ 。
s 中只含有 ‘a’、‘b’ 、‘c’ 三种字母。
如果不存在这样的字符串 s ,请返回一个空字符串 “”。
解题思路
- 当a=b=c 时,直接堆叠a次“abc”字符串即可。
- 若非,若abc中最大和第二大数量相同,那么,将他们记为字母a’和b’,那么堆叠“a’b’”多次,直到abc满足条件1.
- 若仍非,堆叠最大和第二大数量字母“a’a’b’”一次,(此时abc数量会趋向于条件1、2)再重复上述过程
基于以上思想,注意边界退出就好。
C++代码
class Solution {
public:
string longestDiverseString(int a, int b, int c) {
vector<pair<int,char>> num_let ={{a, 'a'}, {b, 'b'}, {c, 'c'}};
string str;
return getLongestDiverseString(num_let,str);
}
string getLongestDiverseString(vector<pair<int, char>>& num_let,string& ret_str){
sort(num_let.begin(), num_let.end(), [](pair<int, char>& n1, pair<int, char>& n2){return (n1.first > n2.first);});
if(num_let[1].first == 0){
for(int i = 0;(i<2)&&(i<num_let[0].first);i++) ret_str.push_back(num_let[0].second);
return ret_str;
}
if(num_let[1].first == num_let[0].first){
for(;num_let[1].first != num_let[2].first;num_let[1].first--){
ret_str.push_back(num_let[0].second);
ret_str.push_back(num_let[1].second);
}
for(;num_let[1].first > 0;num_let[1].first--){ret_str.append(string("abc"));}
return ret_str;
}
ret_str.push_back(num_let[0].second);
ret_str.push_back(num_let[0].second);
ret_str.push_back(num_let[1].second);
num_let[0].first -= 2;
num_let[1].first--;
return getLongestDiverseString(num_let,ret_str);
}
};
Ruby代码
def longest_diverse_string(a, b, c)
return getLongestDiverseString(a,b,c,["a","b","c"],"")
end
def getLongestDiverseString(a,b,c,let_arr,str)
num_arr = [a,b,c]
for i in 0...2 do for j in 0...(2-i) do num_arr[j],num_arr[j+1],let_arr[j],let_arr[j+1] = num_arr[j+1],num_arr[j],let_arr[j+1],let_arr[j] if num_arr[j] < num_arr[j+1] end end
return str if num_arr[0] == 0
if num_arr[1] == 0
for i in 0...(num_arr[0] > 2 ? 2 : num_arr[0]) do str += let_arr[0] end
return str
end
if num_arr[0] == num_arr[1]
while num_arr[1] != num_arr[2]
str += let_arr[0] + let_arr[1]
num_arr[1] -= 1
end
for i in 0...num_arr[1] do str += "abc" end
return str
end
str += let_arr[0] + let_arr[0] + let_arr[1]
return getLongestDiverseString(num_arr[0]-2,num_arr[1]-1,num_arr[2],let_arr,str)
end