小哆啦解题记——字符拼图

小哆啦刷力扣第31天

383. 赎金信 - 力扣(LeetCode)

第一章:离奇的字母饼干失窃案

大雄的课桌上散落着几块字母饼干,拼出"HELP"的字样。"这一定是胖虎干的!"他握着半块残缺的'e'饼干哀嚎,"他说要用magazine饼干拼出'HELL'勒索我!"

哆啦A梦掏出一包铜锣烧,幽幽道:"先别急着哭。你现在有magazine饼干库存'aabcd',胖虎要的ransomNote是'abcc'。你猜缺了哪个字母?"

大雄掰着手指:"a、b、c...第三个c!我的magazine里只有1个c!"

"很好,"哆啦A梦露出狡黠的笑容,"现在,我们要用算法证明胖虎偷吃了c饼干!"


第二章:暴力搜查队的惨败

大雄自告奋勇掏出"枚举放大镜":

typescript 复制代码
function naiveCanConstruct(ransom: string, mag: string): boolean {  
    let magazine = mag.split('');  
    for (let char of ransom) {  
        const pos = magazine.indexOf(char);  
        if (pos === -1) return false;  
        magazine.splice(pos, 1); // 找到一块就掰碎一块  
    }  
    return true;  
}  

当测试naiveCanConstruct("abcc", "aabcd")时,程序突然发出刺耳的警报------原来每次splice都像让大雄在操场上翻找被踩碎的饼干渣,时间复杂度**O(n²)**让CPU风扇疯狂旋转,电脑屏幕飘出焦香。


第三章:哈希神枪手的降维打击

哆啦A梦从四次元口袋掏出一把造型奇特的枪:"试试这个------频率扫描枪!"

作战计划

  1. 建立字母雷达:26格特制弹夹对应a-z
  2. 扫描magazine军火库:每发现一个字母,对应弹夹+1
  3. 发动反攻:对ransomNote每个字母开火,弹夹-1。若弹夹打空则宣告失败
typescript 复制代码
function hashGunCanConstruct(ransomNote: string, magazine: string): boolean {  
    const bulletCase = new Array(26).fill(0);  
    // 填装弹药  
    for (const char of magazine) {  
        bulletCase[char.charCodeAt(0) - 97]++;  
    }  
    // 精确打击  
    for (const char of ransomNote) {  
        const idx = char.charCodeAt(0) - 97;  
        if (--bulletCase[idx] < 0) {  
            console.log(`警报!${char}弹药不足!`);  
            return false;  
        }  
    }  
    return true;  
}  

当测试hashGunCanConstruct("abcc", "aabcd")时,控制台突然喷出彩色烟雾弹:"警报!c弹药不足!"。大雄激动地发现------子弹轨迹可视化让问题无所遁形!


第四章:时空特工の绝地反击

就在众人欢呼时,胖虎发来挑衅视频:"哈哈哈哈,我用时光机复制了100万个c饼干!你的破数组只能存到2^32-1,等着崩溃吧!"

哆啦A梦冷笑一声,按下枪柄上的隐藏按钮:"启动BigInt模式!"

typescript 复制代码
bulletCase[22] = 9999999999999999999999999999999n; // 'w'字母的计数突破天际  

大雄突然发现华点:"等等!如果我们遇到的不是字母而是🦄这样的Emoji..."

哆啦A梦甩出一个泛型函数:

typescript 复制代码
function universalCanConstruct<T extends string>(ransom: T, mag: T): boolean {  
    const frequencyMap = new Map<string, number>();  
    // 宇宙级字符统计  
    for (const char of mag) {  
        frequencyMap.set(char, (frequencyMap.get(char) || 0) + 1);  
    }  
    // 降维打击  
    for (const char of ransom) {  
        const count = frequencyMap.get(char) || 0;  
        if (count <= 0) return false;  
        frequencyMap.set(char, count - 1);  
    }  
    return true;  
}  

"现在连外星文字都能统计了!"哆啦A梦得意地咬了一口铜锣烧。


终章:算法与饼干の哲学

当胖虎在铁证如山前认罪时,静香悄悄告诉大雄:"其实...我吃掉的那个'e',是想测试你的解题速度。"

技术启示录

  1. 空间换时间:哈希表像哆啦A梦的口袋,牺牲少量空间换取极致速度
  2. 预处理思维:先扫描magazine如同战前清点弹药,避免战时手忙脚乱
  3. 扩展性设计:用Map替代数组,如同给算法装上任意门

大雄望着星空感叹:"原来每一个算法,都是时空管理者写给计算机的浪漫情书啊..."

(窗外传来胖虎的怒吼:"谁把我的'c'饼干写成'C'了?大小写敏感怎么不说清楚!")

相关推荐
能工智人小辰6 分钟前
Codeforces Round 509 (Div. 2) C. Coffee Break
c语言·c++·算法
kingmax542120087 分钟前
CCF GESP202503 Grade4-B4263 [GESP202503 四级] 荒地开垦
数据结构·算法
岁忧12 分钟前
LeetCode 高频 SQL 50 题(基础版)之 【高级字符串函数 / 正则表达式 / 子句】· 上
sql·算法·leetcode
eachin_z1 小时前
力扣刷题(第四十九天)
算法·leetcode·职场和发展
闻缺陷则喜何志丹1 小时前
【强连通分量 缩点 拓扑排序】P3387 【模板】缩点|普及+
c++·算法·拓扑排序·洛谷·强连通分量·缩点
机器学习之心2 小时前
机器学习用于算法交易(Matlab实现)
算法·机器学习·matlab
AL流云。2 小时前
【优选算法】C++滑动窗口
数据结构·c++·算法
qq_429879673 小时前
省略号和可变参数模板
开发语言·c++·算法
飞川撸码4 小时前
【LeetCode 热题100】网格路径类 DP 系列题:不同路径 & 最小路径和(力扣62 / 64 )(Go语言版)
算法·leetcode·golang·动态规划
Neil今天也要学习4 小时前
永磁同步电机参数辨识算法--IPMSM拓展卡尔曼滤波全参数辨识
单片机·嵌入式硬件·算法