LeetCode No.383 Ransom Note | #a

2016-11-13  本文已影响0人  wxqyppqm

Q:

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

A:

canConstruct("cab", "bca") -> true 并不考虑顺序,只考虑个数。

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

arr[c - 'a'] ++ 其实操作的过程是:

  1. 因为数组一共有26位,其实每一位代表的是一个lowercase letter。
  2. c-'a'的目的是节省空间,ACSII码字符对照表中,a~z = 97~122。
  3. 然后++操作,就是计数,累计。 arr[index]++; = arr[index] = arr[index]+1;

toCharArray() 省去了for loop遍历:
for (int i = 0; i < magazine.length(); i++) { arr[magazine.charAt(i) - 'a']++; }

比如“bbcab”这个字符串:

对于ransomNote的字符数组来说,看到一个要 --arr[index]一个,作累减操作。当发现ransom里的字母比magazine里多的时候,返回false。比如("aa","a")这个情况,第一个for loop结束时, arr[0] = 1,但我们ransomNote里将要作两次“--”操作。


Notes:

字符数组
toCharArray() 将字符串--->字符数组
valueOf() 将char类型的数组--->字符串

字符串常亮数组,初始化:

 char c[] = {"abc"};
 char c[] = "abc";````

上一篇 下一篇

猜你喜欢

热点阅读