题目描述
警察在侦破一个案件时,得到了线人给出的可能犯罪时间,形如 “HH:MM” 表示的时刻。
根据警察和线人的约定,为了隐蔽,该时间是修改过的,
解密规则为:利用当前出现过的数字,构造下一个距离当前时间最近的时刻,则该时间为可能的犯罪时间。
每个出现数字都可以被无限次使用。
输入描述
形如HH:SS字符串,表示原始输入。
输出描述
形如HH:SS的字符串,表示推理处理的犯罪时间。
备注
1.可以保证现任给定的字符串一定是合法的。
例如,“01:35”和“11:08”是合法的,“1:35”和“11:8”是不合法的。
2.最近的时刻可能在第二天。
用例
| 输入 | 输出 |
|---|---|
| 20:12 | 20:20 |
| 23:59 | 22:22 |
| 12:58 | 15:11 |
| 18:52 | 18:55 |
| 23:52 | 23:53 |
| 09:17 | 09:19 |
| 07:08 | 08:00 |
思路
找出所有时间,排序后选出最近的
#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <regex>
#include <algorithm>
using namespace std;
regex pattern("(([01][0-9])|([2][0-3]))[0-5][0-9]");
void dfs(vector<char> &arr, const string &path, vector<string>&res) {
if (path.size() == 4) {
if (regex_match(path,pattern )) {
res.push_back(path);
}
return;
}
for (const auto &c: arr) {
dfs(arr, path + c, res);
}
}
int main() {
string s;
cin >> s;
string hour = s.substr(0, 2);
string minute = s.substr(3, 2);
set<char> charSet;
for (const auto &c: hour) {
charSet.insert(c);
}
for (const auto &c: minute) {
charSet.insert(c);
}
vector<char> charArr;
for (const auto &c: charSet) {
charArr.emplace_back(c);
}
vector<string> res;
dfs(charArr, "", res);
sort(res.begin(), res.end());
string curTime = hour + minute;
int i = 0;
for (; i < res.size(); i++) {
if (res[i] == curTime) {
break;
}
}
string ans;
if (i == res.size() - 1) {
ans = res[0];
} else {
ans = res[i + 1];
}
cout << ans.substr(0, 2) << ":" << ans.substr(2) << endl;
return 0;
}