前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode笔记:383. Ransom Note

LeetCode笔记:383. Ransom Note

作者头像
Cloudox
发布2021-11-23 15:39:33
2170
发布2021-11-23 15:39:33
举报
文章被收录于专栏:月亮与二进制月亮与二进制

问题:

Given an arbitrary ransom note string and another string containing letters from all the magazines, write a function that will return true if the ransom note can be constructed from the magazines ; otherwise, it will return false. Each letter in the magazine string can only be used once in your ransom note. Note: You may assume that both strings contain only lowercase letters. canConstruct("a", "b") -> false canConstruct("aa", "ab") -> false canConstruct("aa", "aab") -> true

大意:

给出一个任意的勒索信字符串和另一个的包含所有从杂志中来的字母的字符串,写一个函数,如果勒索信可以被杂志重构得到则返回true;否则返回false。 杂志中的每个字母都只能被使用一次。 注意: 你可以假设字符串都只包含小写字母。 canConstruct("a", "b") -> false canConstruct("aa", "ab") -> false canConstruct("aa", "aab") -> true

思路:

  1. 首先想到的一个思路是以各个地在magazine中寻找note中的字母,找到一个则删去一个,若有找不到的就是false了,若找到最后一个都找到了,则是true了。
  2. 第一个思路做出来后,运行时间高达91ms,想来是每个字母的寻找过程都比较耗时,于是参照以前的经验,对于这种全是小写字母进行比较字符串的,还是可以拿两个26位的数字数组来存储两个字符串中每个字母找到的个数,然后去比较两个数字数组中的数字,不同的是,这里要比较的是note对应的数组中,不为0的字母位置的数字,在magazine数组中的数字是否大于note中的数字,注意是大于而不是等于,因为目的是magazine可以拼出note来,而不是完全相同,这样一来耗时迅速减少到了17ms,优化很明显。

代码(Java):

第一种方法:

代码语言:javascript
复制
public class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        char[] noteArr = new char[ransomNote.length()];
        noteArr = ransomNote.toCharArray();
        for (int i = 0; i < noteArr.length; i++) {
            if (magazine.indexOf(noteArr[i]) == -1) return false;
            else {
                int position = magazine.indexOf(noteArr[i]);
                String before = magazine.substring(0, position);
                String after = magazine.substring(position+1, magazine.length());
                magazine = before.concat(after);
            }
        }
        return true;
    }
}

第二种方法:

代码语言:javascript
复制
public class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        char[] noteArr = new char[ransomNote.length()];
        noteArr = ransomNote.toCharArray();
        char[] magazineArr = new char[magazine.length()];
        magazineArr = magazine.toCharArray();
        // int数组默认会初始化为全为0
        int[] noteLetter = new int[26];
        int[] magazineLetter = new int[26];
        for (int i = 0; i < noteArr.length; i++) {
            int position = noteArr[i] - 'a';
            noteLetter[position]++;
        }
        for (int i = 0; i < magazineArr.length; i++) {
            int position = magazineArr[i] - 'a';
            magazineLetter[position]++;
        }
        for (int i = 0; i < 26; i++) {
            if (noteLetter[i] != 0 && noteLetter[i] > magazineLetter[i]) return false;
        }
        return true;
    }
}

查看作者首页

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017/11/21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题:
  • 大意:
  • 思路:
  • 代码(Java):
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档