20.4.12 赎金信 简单

本文介绍了一种解决勒索信问题的字符串匹配算法,通过排序和双指针技巧实现,详细阐述了解题思路和代码实现,同时提出使用map进行优化的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

image.png
时间复杂度O(n²),空间复杂度应该是O(n)

题目

解题思路

  1. 排序,就可以按顺序来对比知道有没有那个字母和够不够用了;

代码思路

  1. 排除特殊情况;
  2. 用两个vector存起两个string;
  3. 排序;
  4. 循环遍历赎金信,record记录对比杂志magazine相应位置时要后移多少位;
  5. 如果相同,继续遍历,如果不同,magazine的指针后移,即record+1,magazine指针后移不能超过magazine的长度;
  6. 跳出后移循环后,判断,赎金信剩下的长度不能超过magazine剩下的长度,再判断跳出是因为遇到相同的字符还是后移到尽头了。
  7. 用map更好更简单,直接存起magazine各个字母的数量,遍历赎金信的每个字母,在map中遇到,map的value-1,没遇到即返回错误。

代码

class Solution {
public:
    bool canConstruct(string ransomNote, string magazine) {
        if(ransomNote.length() == 0) return true;
        if(magazine.length() == 0 || ransomNote.length() > magazine.length()) return false;

        vector<char> r;
        r.resize(ransomNote.length());
        r.assign(ransomNote.begin(), ransomNote.end());

        vector<char> m;
        m.resize(magazine.length());
        m.assign(magazine.begin(), magazine.end());

        sort(r.begin(), r.end());
        sort(m.begin(), m.end());


        for(int i = 0, record = 0; i < r.size(); i++){
            if(r[i] == m[i+record]) continue;
            else{
                while(i + record < m.size() - 1 && r[i] != m[i+record]) record++;
                if(r.size() - i > m.size() - i - record) return false;
                if(r[i] != m[i+record]) return false;
            }
        }
        return true;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值