24. 解密犯罪时间

80 阅读1分钟

题目描述

警察在侦破一个案件时,得到了线人给出的可能犯罪时间,形如 “HH:MM” 表示的时刻。

根据警察和线人的约定,为了隐蔽,该时间是修改过的,

解密规则为:利用当前出现过的数字,构造下一个距离当前时间最近的时刻,则该时间为可能的犯罪时间。

每个出现数字都可以被无限次使用。

输入描述

形如HH:SS字符串,表示原始输入。

输出描述

形如HH:SS的字符串,表示推理处理的犯罪时间。

备注

1.可以保证现任给定的字符串一定是合法的。

例如,“01:35”和“11:08”是合法的,“1:35”和“11:8”是不合法的。

2.最近的时刻可能在第二天。

用例

输入输出
20:1220:20
23:5922:22
12:5815:11
18:5218:55
23:5223:53
09:1709:19
07:0808: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;
}