cstring判断是否包含子串_76. 最小覆盖子串

8a92276790c42f57eef35f845e4b5a9f.gif
给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。

示例:

输入: S = "ADOBECODEBANC", T = "ABC"
输出: "BANC"

说明:

1. 如果 S 中不存这样的子串,则返回空字符串 ""。
2. 如果 S 中存在这样的子串,我们保证它是唯一的答案。

解题思路

  1. Use two pointers: start and end to represent a window.
  2. Move end to find a valid window.
  3. When a valid window is found, move start to find a smaller window.

notice

  1. 因为字符可以重复,收缩窗口时需要根据window里面的字符出现频数是否与needs里面字符频数一致去更新count。
  2. 在更新 minimum length of substring 时,因为上面right指针已经 + 1,判断与更新时使用 right - left 即可。

代码

class 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
给下面代码每一行给上注释并说明这段代码的意思#include "pch.h" #include "FinBudgetSupport.h" #include <map> time_t StringToDateTime(char* str) { tm tm_; int year, month, day, hour, min, sec; afxDump << str << "\n\n\n\n"; sscanf_s(str, "%d-%d-%d %d:%d:%d", &year, &month, &day, &hour, &min, &sec); tm_.tm_year = year - 1900; tm_.tm_mon = month - 1; tm_.tm_mday = day; tm_.tm_hour = hour; tm_.tm_min = min; tm_.tm_sec = sec; tm_.tm_isdst = -1; time_t t_ = mktime(&tm_); return t_; } CString DateTimeToString(time_t _time) { tm *_tm = new tm(); gmtime_s(_tm ,&_time); CString t_str; t_str.Format(_T("%d-%d-%d %d:%d:%d"), _tm->tm_year+1900, 1+_tm->tm_mon, _tm->tm_mday, _tm->tm_hour , _tm->tm_min, _tm->tm_sec); delete _tm; return t_str; } CString _toCString(double _value) { CString t_str; t_str.Format(_T("%lf"), _value); return t_str; } CString _toCString(int _value) { CString t_str; t_str.Format(_T("%d"), _value); return t_str; } double _toDouble(CString _str) { return _ttof(_str); } char* CStringToCharArray(CString str) { int str_len = WideCharToMultiByte(CP_ACP, 0, str, str.GetLength(), NULL, 0, NULL, NULL);//计算字节数 char* CharArray = new char[str_len + 1]; WideCharToMultiByte(CP_ACP, 0, str, str.GetLength(), CharArray, str_len, NULL, NULL); CharArray[str_len] = '\0'; return CharArray; } void SplitString(const std::string& s, std::vector<std::string>& v, const std::string& c) { std::string::size_type pos1, pos2; pos2 = s.find(c); pos1 = 0; while (std::string::npos != pos2) { v.push_back(s.substr(pos1, pos2 - pos1)); pos1 = pos2 + c.size(); pos2 = s.find(c, pos1); } if (pos1 != s.length()) v.push_back(s.substr(pos1)); }
最新发布
06-10
注释如下: #include "pch.h" // 预编译头文件 #include "FinBudgetSupport.h" // 包含自定义头文件 #include <map> // 包含 STL 中的 map 容器 time_t StringToDateTime(char* str) { // 定义函数 StringToDateTime,将字符串转换为时间类型 tm tm_; // 定义 tm 结构体变量 int year, month, day, hour, min, sec; // 定义年月日时分秒变量 afxDump << str << "\n\n\n\n"; // 输出调试信息 sscanf_s(str, "%d-%d-%d %d:%d:%d", &year, &month, &day, &hour, &min, &sec); // 将字符串按照指定格式转换为年月日时分秒 tm_.tm_year = year - 1900; // 年份减去 1900 tm_.tm_mon = month - 1; // 月份减去 1 tm_.tm_mday = day; // 日 tm_.tm_hour = hour; // 时 tm_.tm_min = min; // 分 tm_.tm_sec = sec; // 秒 tm_.tm_isdst = -1; // 是否为夏令时(-1 表示未知) time_t t_ = mktime(&tm_); // 将 tm 结构体变量转换为 time_t 类型的时间 return t_; // 返回时间 } CString DateTimeToString(time_t _time) { // 定义函数 DateTimeToString,将时间转换为字符串 tm *_tm = new tm(); // 定义 tm 结构体指针 gmtime_s(_tm, &_time); // 将时间转换为 tm 结构体变量 CString t_str; // 定义字符串变量 t_str.Format(_T("%d-%d-%d %d:%d:%d"), _tm->tm_year + 1900, 1 + _tm->tm_mon, _tm->tm_mday, _tm->tm_hour, _tm->tm_min, _tm->tm_sec); // 将 tm 结构体变量格式化为字符串 delete _tm; // 释放内存 return t_str; // 返回字符串 } CString _toCString(double _value) { // 定义函数 _toCString,将 double 类型转换为 CString 类型 CString t_str; // 定义字符串变量 t_str.Format(_T("%lf"), _value); // 将 double 类型格式化为字符串 return t_str; // 返回字符串 } CString _toCString(int _value) { // 定义函数 _toCString,将 int 类型转换为 CString 类型 CString t_str; // 定义字符串变量 t_str.Format(_T("%d"), _value); // 将 int 类型格式化为字符串 return t_str; // 返回字符串 } double _toDouble(CString _str) { // 定义函数 _toDouble,将 CString 类型转换为 double 类型 return _ttof(_str); // 调用 _ttof 函数将 CString 类型转换为 double 类型并返回 } char* CStringToCharArray(CString str) { // 定义函数 CStringToCharArray,将 CString 类型转换为 char* 类型 int str_len = WideCharToMultiByte(CP_ACP, 0, str, str.GetLength(), NULL, 0, NULL, NULL); // 计算需要的字节数 char* CharArray = new char[str_len + 1]; // 根据需要的字节数分配内存 WideCharToMultiByte(CP_ACP, 0, str, str.GetLength(), CharArray, str_len, NULL, NULL); // 将 CString 类型转换为 char* 类型 CharArray[str_len] = '\0'; // 将 char* 数组最后一位赋值为 '\0' return CharArray; // 返回 char* 数组 } void SplitString(const std::string& s, std::vector<std::string>& v, const std::string& c) { // 定义函数 SplitString,将字符串按照指定字符进行分割 std::string::size_type pos1, pos2; // 定义两个字符串位置变量 pos2 = s.find(c); // 在字符串中查找指定字符的位置 pos1 = 0; // 初始化 pos1 while (std::string::npos != pos2) // 如果找到指定字符 { v.push_back(s.substr(pos1, pos2 - pos1)); // 将字符串中指定字符前面的部分作为一个子串存入 vector 容器中 pos1 = pos2 + c.size(); // 更新 pos1 的位置 pos2 = s.find(c, pos1); // 继续查找指定字符的位置 } if (pos1 != s.length()) // 如果还剩下一部分字符串 v.push_back(s.substr(pos1)); // 将剩下的字符串作为一个子串存入 vector 容器中 } 这段代码的主要作用是定义了一些函数,用于字符串和时间类型的转换,以及将字符串按照指定字符进行分割等操作。其中使用了一些 C++ 的标准库函数和 Windows API 函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值