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

小哆啦刷力扣第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'了?大小写敏感怎么不说清楚!")

相关推荐
C雨后彩虹4 小时前
任务最优调度
java·数据结构·算法·华为·面试
少林码僧6 小时前
2.31 机器学习神器项目实战:如何在真实项目中应用XGBoost等算法
人工智能·python·算法·机器学习·ai·数据挖掘
钱彬 (Qian Bin)6 小时前
项目实践15—全球证件智能识别系统(切换为Qwen3-VL-8B-Instruct图文多模态大模型)
人工智能·算法·机器学习·多模态·全球证件识别
Niuguangshuo7 小时前
EM算法详解:解密“鸡生蛋“的机器学习困局
算法·机器学习·概率论
a3158238067 小时前
Android 大图显示策略优化显示(一)
android·算法·图片加载·大图片
一条大祥脚7 小时前
26.1.9 轮廓线dp 状压最短路 构造
数据结构·c++·算法
鲨莎分不晴7 小时前
反向传播的数学本质:链式法则与动态规划的完美共舞
算法·动态规划
sonadorje8 小时前
逻辑回归中的条件概率
算法·机器学习·逻辑回归
cici158748 小时前
基于Pan-Tompkins算法的ECG信号HRV提取方案
算法
McGrady-1758 小时前
拓扑导航 vs 几何导航的具体实现位置
算法