Given a time represented in the format "HH:MM", form the next closest time by reusing the current digits. There is no limit on how many times a digit can be reused.
You may assume the given input string is always valid. For example, "01:34", "12:09" are all valid. "1:34", "12:9" are all invalid.
Example 1:
Input: "19:34" Output: "19:39" Explanation: The next closest time choosing from digits 1, 9, 3, 4, is 19:39, which occurs 5 minutes later. It is not 19:33, because this occurs 23 hours and 59 minutes later.
Example 2:
Input: "23:59" Output: "22:22" Explanation: The next closest time choosing from digits 2, 3, 5, 9, is 22:22. It may be assumed that the returned time is next day's time since it is smaller than the input time numerically.
public:
string nextClosestTime(string time) {
vector<char> digit;
for (int i = 0; i < 5; i++) {
if (i == 2) {
continue;
}
bool flag = false;
for(int j = 0; j < digit.size(); j++) {
if(time[i] == digit[j]) {
flag = true;
break;
}
}
if (!flag) {
digit.push_back(time[i]);
}
}
if (digit.size() == 1) {
return time;
}
vector<string> times;
generate_time(times, "", digit, 0, time);
string close = "";
int min= INT_MAX;
for (int i = 0; i < times.size(); i++) {
int diff = cacl_diff(time, times[i]);
if (diff < min) {
min = diff;
close = times[i];
}
}
return close;
}
private:
void generate_time(vector<string>& times, string tmp,
vector<char> digit, int ind, string time) {
if (ind == 2) {
generate_time(times, tmp + ":", digit, ind + 1, time);
}
if (ind == 5) {
if (is_valid(tmp) && tmp != time) {
times.push_back(tmp);
return;
}
}
if (ind != 2 && ind != 5) {
for (int i = 0; i < digit.size(); i++) {
generate_time(times, tmp + digit[i], digit, ind + 1, time);
}
}
}
bool is_valid(string str) {
int num1 = stoi(str.substr(0, 2));
int num2 = stoi(str.substr(3, 2));
if (num1 <= 23 && num2 <= 59) {
return true;
}
return false;
}
int cacl_diff(string time, string time1) {
int hour1 = stoi(time.substr(0, 2));
int hour2 = stoi(time1.substr(0, 2));
int minute1 = stoi(time.substr(3, 2));
int minute2 = stoi(time1.substr(3, 2));
int diff = 0;
if (hour2 > hour1) {
diff += 60 * (hour2 - hour1);
diff += minute2 - minute1;
}
else if (hour2 == hour1) {
if (minute2 >= minute1) {
diff += minute2 - minute1;
}
else {
diff += 60 * 24 + minute2 - minute1;
}
}
else {
hour2 += 24;
diff += 60 * (hour2 - hour1);
diff += minute2 - minute1;
}
return diff;
}
};