学习网站后台维护中国空间站什么时候建成
web/
2025/10/3 7:05:29/
文章来源:
学习网站后台维护,中国空间站什么时候建成,网站建设论文设计,武威网站制作公司哪个好作者推荐
视频算法专题
本文涉及知识点
数学 回溯 字符串 性能优化
LeetCode1307. 口算难题
给你一个方程#xff0c;左边用 words 表示#xff0c;右边用 result 表示。 你需要根据以下规则检查方程是否可解#xff1a; 每个字符都会被解码成一位数字#xff08;0 - …作者推荐
视频算法专题
本文涉及知识点
数学 回溯 字符串 性能优化
LeetCode1307. 口算难题
给你一个方程左边用 words 表示右边用 result 表示。 你需要根据以下规则检查方程是否可解 每个字符都会被解码成一位数字0 - 9。 每对不同的字符必须映射到不同的数字。 每个 words[i] 和 result 都会被解码成一个没有前导零的数字。 左侧数字之和words等于右侧数字result。 如果方程可解返回 True否则返回 False。 示例 1 输入words [“SEND”,“MORE”], result “MONEY” 输出true 解释映射 ‘S’- 9, ‘E’-5, ‘N’-6, ‘D’-7, ‘M’-1, ‘O’-0, ‘R’-8, ‘Y’-‘2’ 所以 “SEND” “MORE” “MONEY” , 9567 1085 10652 示例 2
输入words [“SIX”,“SEVEN”,“SEVEN”], result “TWENTY” 输出true 解释映射 ‘S’- 6, ‘I’-5, ‘X’-0, ‘E’-8, ‘V’-7, ‘N’-2, ‘T’-1, ‘W’-‘3’, ‘Y’-4 所以 “SIX” “SEVEN” “SEVEN” “TWENTY” , 650 68782 68782 138214 示例 3
输入words [“THIS”,“IS”,“TOO”], result “FUNNY” 输出true 示例 4
输入words [“LEET”,“CODE”], result “POINT” 输出false
提示
2 words.length 5 1 words[i].length, results.length 7 words[i], result 只含有大写英文字母 表达式中使用的不同字符数最大为 10
回溯
简单的例子 AB AC BCD 10AB10AC 100B10CD 20A-99B -9C-D 0 系数20,-99,-9,-1 放到向量v中并排序。如果直接回溯时间复杂度1010超时。 将v排序从后到前处理。处理v[i]先估算v[0,i)的最小值iMin和最大值iMax如果已有值xiMin 0或 xiMax 0则剪枝忽略。 求最小值 如果存在负数最小的负数绝对值最大对应最大的未选择值。如果存在正数最大的正数取最小的未选择数。 求最大值 如果存在负数最小的负数绝对值最大对应最小的未选择值。如果存在正数最大的正数取最大的未选择数。
代码
核心代码超时
class Solution {
public:bool isSolvable(vectorstring words, string result) {unordered_mapchar, int mCharCnt; unordered_mapchar, bool mCharNot0;//开头不能为0auto Add [](int iMul, const string s){for (int i s.length() - 1; i 0; i--, iMul*10){mCharCnt[s[i]] iMul;}if (s.length() 1){mCharNot0[s[0]] true;}};for (const auto s : words){Add(1, s);}Add(-1, result);vectorpairint,int v;for (const auto [tmp, cnt] : mCharCnt){v.emplace_back(cnt,mCharNot0[tmp]);}sort(v.begin(), v.end());setint setSel;for (int i 0; i 10; i){setSel.emplace(i);}return DFS(v, setSel, 0, 0);}templateclass Print MinMax(const pairint, int*p, int n, setint,Pr setSel){int result 0;for (int i 0; i ! n;){if (p[i].first 0){result *setSel.begin()*p[i].first;setSel.erase(setSel.begin());}else{result *setSel.rbegin()*p[--n].first;setSel.erase(std::prev(setSel.end()));}}return result;}bool DFS(const vectorpairint,int v, setint setSel, int leve, int result){if (v.size() leve){return 0 result;}const int iMin MinMax(v.data()leve, v.size()-leve, setint, std::greaterint(setSel.begin(), setSel.end()));const int iMax MinMax(v.data() leve, v.size() - leve, setSel);if ((iMin result 0) || (iMax result 0)){return false;}for (int i 9; i v[leve].second; i--){if (!setSel.count(i)){continue;}setSel.erase(i); if (DFS(v, setSel, leve 1, result v[leve].first * i)){return true;}setSel.emplace(i);}return false;}
};测试用例
templateclass T,class T2
void Assert(const T t1, const T2 t2)
{assert(t1 t2);
}templateclass T
void Assert(const vectorT v1, const vectorT v2)
{if (v1.size() ! v2.size()){assert(false);return;}for (int i 0; i v1.size(); i){Assert(v1[i], v2[i]);}}int main()
{vectorstring words;string result;{Solution sln;words { A,B }, result A;auto res sln.isSolvable(words, result);Assert(true, res);}{Solution sln;words { CBA,CBA,CBA,CBA,CBA }, result EDD;auto res sln.isSolvable(words, result);Assert(false, res);}{Solution sln;words { SEND, MORE }, result MONEY;auto res sln.isSolvable(words, result);Assert(true, res);}{Solution sln;words { SIX, SEVEN, SEVEN }, result TWENTY;auto res sln.isSolvable(words, result);Assert(true, res);}{Solution sln;words { THIS, IS, TOO }, result FUNNY;auto res sln.isSolvable(words, result);Assert(true, res);}{Solution sln;words { LEET, CODE }, result POINT;auto res sln.isSolvable(words, result);Assert(false, res);}
}估算最小值最大值
pairint,int MinMaxSingle(const pairint, int* p, int n)
{int less0 0, more0 0;for (int i 0; i n ; i ){if (p[i].first 0){less0 p[i].first;}else{more0 p[i].first;}}return { less0 * 9,more0 * 9 };
}可以提升一倍还是过不了。 一for循环也可以省略。 二向量变原生数组。 这两个方法效果很小。
class Solution {
public:bool isSolvable(vectorstring words, string result) {unordered_mapchar, int mCharCnt; unordered_mapchar, bool mCharNot0;//开头不能为0auto Add [](int iMul, const string s){for (int i s.length() - 1; i 0; i--, iMul*10){mCharCnt[s[i]] iMul;}if (s.length() 1){mCharNot0[s[0]] true;}};for (const auto s : words){Add(1, s);}Add(-1, result);pairint, int v[10];int less0 0, more0 0;for (const auto [tmp, cnt] : mCharCnt){v[m_c] { cnt,mCharNot0[tmp] }; if (cnt 0){less0 cnt;}else{more0 cnt;}}sort(v, vm_c);setint setSel;for (int i 0; i 10; i){setSel.emplace(i);}return DFS(v, setSel, 0, 0,more0,less0);}bool DFS(const pairint, int* p, setint setSel, int leve, int result,int more0,int less0){if (m_c leve){return 0 result;}if ((less0*9 result 0) || (more0*9 result 0)){return false;}for (int i 9; i p[leve].second; i--){if (!setSel.count(i)){continue;}setSel.erase(i); const int curLess0 min(0, p[leve].first);const int curMore0 max(0, p[leve].first);if (DFS(p, setSel, leve 1, result p[leve].first * i,more0curMore0,less0curLess0)){return true;}setSel.emplace(i);}return false;} int m_c 0;
};先处理绝对值大的
速度提升大约1000倍。
class Solution {
public:bool isSolvable(vectorstring words, string result) {unordered_mapchar, int mCharCnt; unordered_mapchar, bool mCharNot0;//开头不能为0auto Add [](int iMul, const string s){for (int i s.length() - 1; i 0; i--, iMul*10){mCharCnt[s[i]] iMul;}if (s.length() 1){mCharNot0[s[0]] true;}};for (const auto s : words){Add(1, s);}Add(-1, result);pairint, int v[10];int less0 0, more0 0;for (const auto [tmp, cnt] : mCharCnt){v[m_c] { cnt,mCharNot0[tmp] }; if (cnt 0){less0 cnt;}else{more0 cnt;}}sort(v, v m_c, [](const auto pr1, const auto pr2) {return abs(pr1.first) abs(pr2.first); });setint setSel;for (int i 0; i 10; i){setSel.emplace(i);}return DFS(v, setSel, 0, 0,more0,less0);}bool DFS(const pairint, int* p, setint setSel, int leve, int result,int more0,int less0){if (m_c leve){return 0 result;}if ((less0*9 result 0) || (more0*9 result 0)){return false;}for (int i 9; i p[leve].second; i--){if (!setSel.count(i)){continue;}setSel.erase(i); const int curLess0 min(0, p[leve].first);const int curMore0 max(0, p[leve].first);if (DFS(p, setSel, leve 1, result p[leve].first * i,more0-curMore0,less0-curLess0)){return true;}setSel.emplace(i);}return false;} int m_c 0;
};扩展阅读
视频课程
有效学习明确的目标 及时的反馈 拉伸区难度合适可以先学简单的课程请移步CSDN学院听白银讲师也就是鄙人的讲解。 https://edu.csdn.net/course/detail/38771
如何你想快
速形成战斗了为老板分忧请学习C#入职培训、C入职培训等课程 https://edu.csdn.net/lecturer/6176
相关
下载
想高屋建瓴的学习算法请下载《喜缺全书算法册》doc版 https://download.csdn.net/download/he_zhidan/88348653
我想对大家说的话闻缺陷则喜是一个美好的愿望早发现问题早修改问题给老板节约钱。子墨子言之事无终始无务多业。也就是我们常说的专业的人做专业的事。如果程序是一条龙那算法就是他的是睛
测试环境
操作系统win7 开发环境 VS2019 C17 或者 操作系统win10 开发环境 VS2022 C17 如无特殊说明本算法用**C**实现。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/86083.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!