681. Next Closest Time(Accepted)

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.

class Solution {
public:
    string nextClosestTime(string time) {
        vector<int>digits;
        min_diff = INT_MAX;
        int pos = time.find(':');
        for(int i = 0;i<pos;i++) digits.push_back(time[i]-'0');
        for(int i = pos+1;i<time.size();i++) digits.push_back(time[i]-'0');
        if(isSameDigits(digits)) return time;
        cout << time.substr(0,pos) << endl;
        cout << time.substr(pos+1) << endl;
        curr_time = stoll(time.substr(0,pos))*60+stoll(time.substr(pos+1));
        string tmp,res;
        unordered_set<string>set;
        set.insert(time);
        string _time;
        dfs(digits,_time,set,res); 
        return res;
    }
    void dfs(vector<int>digits,string _time,unordered_set<string>&set,string &res)
    {
        
        if(_time.size()==digits.size())
        {
            for(int j = 1;j<_time.size();j++)
            {
                string hour = _time.substr(0,j);
                string min = _time.substr(j);
                if(hour.size()>2 || min.size()>2) continue;
                if(stoi(hour)>24 || stoi(min)>=60) continue;
                if(set.find(hour+":"+min)!=set.end()) continue;
                set.insert(hour+":"+min);
               
                int curr_diff = calculate(hour,min);
                cout << "curr_diff = " << curr_diff << " for time:" << hour+":"+min << endl;
                if(curr_diff < min_diff)
                {
                    min_diff = curr_diff;
                    res = hour+":"+min;
                }
            }
            return;
        }
        for(int i = 0;i<digits.size();i++)
            dfs(digits,_time+to_string(digits[i]),set,res);
    }
private:
    int curr_time;
    int min_diff;
    int calculate(string hour,string minute)
    {
        int curr = stoi(hour)*60+stoi(minute);
        int diff;
        if(curr<curr_time)
            diff = curr+24*60-curr_time;
        else
            diff = curr-curr_time;
        return diff;
    }
    
    bool isSameDigits(vector<int>digits)
    {
        for(int i=1;i<digits.size();i++)
            if(digits[i]!=digits[i-1]) return false;
        return true;
    }
};

 

转载于:https://www.cnblogs.com/jxr041100/p/8437970.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值