383-Ransom Note

原题

给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
如果可以,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。

示例 1:

输入:ransomNote = "a", magazine = "b"
输出:false
示例 2:

输入:ransomNote = "aa", magazine = "ab"
输出:false
示例 3:

输入:ransomNote = "aa", magazine = "aab"
输出:true
 
提示:
1 <= ransomNote.length, magazine.length <= 105
ransomNote 和 magazine 由小写英文字母组成

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/ransom-note
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解答

class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        if (ransomNote.length() > magazine.length()){
            return false;
        }
        int[] cnt = new int [26];
        for (char c: magazine.toCharArray()){
            cnt[c - 'a']++;
        }
        for (char c: ransomNote.toCharArray()){
            cnt[c - 'a']--;
            if(cnt[c - 'a'] < 0){
                return false;
            }
        }
        return true;
    }
}

缕清思路

  • 本题的思路是,用一个字符数组来计数,对magazine字符串中相同的字符做加运算,再对ransomNote字符串中相同的字符做减运算,若对应数组元素的值小于零,则返回false,否则返回true。
  • 写题时,对于String.toCharArray()方法的使用,存在一些疑惑。
    • String.toCharArray()方法,作用是将字符串转换为字符数组
    • Jdk1.8中,toCharArray()的源码
/**
     * Converts this string to a new character array.
     *
     * @return  a newly allocated character array whose length is the length
     *          of this string and whose contents are initialized to contain
     *          the character sequence represented by this string.
     */
    public char[] toCharArray() {
        // Cannot use Arrays.copyOf because of class initialization order issues
        char result[] = new char[value.length];
        System.arraycopy(value, 0, result, 0, value.length);
        return result;
    }

我们来分析源码,先看一下注释:

  1. Converts this string to a new character array,即‘将这个字符串变为一个新的字符数组’;
    其中,value是被private final char[]修饰的存储字符序列的成员变量。
  2. @return a newly allocated character array whose length is the length of this string and whose contents are initialized to contain the character sequence represented by this string,即‘@返回 一个新分配的字符数组,其长度为该字符串的长度,其内容被初始化为包含该字符串所表示的字符序列’;
  3. Cannot use Arrays.copyOf because of class initialization order issues,即‘由于类初始化顺序问题,无法使用Arrays.copyOf’;
    然后看代码:
  4. value.length指的是String的每个char元素存放在final型的char[]数组的成员变量的长度;
  5. arraycopy()用来复制数组,详解
  6. 最后返回一个result数组。

参考文献来源

  1. Java String toCharArray() 方法
  2. String类的toCharArray方法【源码赏析】
posted @ 2022-06-30 15:45  一样花开  阅读(61)  评论(0)    收藏  举报