美文网首页
LeetCode No.383 Ransom Note | #a

LeetCode No.383 Ransom Note | #a

作者: wxqyppqm | 来源:发表于2016-11-13 18:53 被阅读0次

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”这个字符串:

  • 我们看到第一个b,其实就是charAt(0),然后这个值就是‘b’-'a' = 98-97 = 1,arr[1]。也就是说这个数组里index=1的位置上的value表示的是“b字母的个数”,一开始是0,现在++后是1了。
  • 然后看到第二个b,其实就是charAt(1),然后这个值也是‘b’-'a' = 98-97 = 1,arr[1]。我们要再一次更改arr[1]的值了,现在是2了。
  • 接下来是第一个c,其实就是charAt(2),但是这个值计算为'c'-'a' = 99 -97 = 2,'arr[2]'。我们现在要对arr[2]的数字进行累加。
  • 之后的以此类推。

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


Notes:

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

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

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

相关文章

网友评论

      本文标题:LeetCode No.383 Ransom Note | #a

      本文链接:https://www.haomeiwen.com/subject/ztkcpttx.html