赎金信(简单)
2020年6月24日
题目来源:力扣
解题
- 第一种
该方法与猜数字游戏这道题的方法类似,不再赘述。
这里数组定为58是因为我觉得字符没说大小写,A的ascall码为65,z的ascall码为122,122-65=57
但这种做法时间被字符长度定死了,肯定比较慢
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
int rlen=ransomNote.length();
int mlen=magazine.length();
if(rlen>mlen) return false;
int[] nums=new int[58];
int count=0;
int max=rlen>=mlen ? rlen:mlen;
for(int i=0;i<max;i++){
if(i<rlen){
if(nums[ransomNote.charAt(i)-'A']>0)
count++;
nums[ransomNote.charAt(i)-'A']--;
}
if(i<mlen){
if(nums[magazine.charAt(i)-'A']<0)
count++;
nums[magazine.charAt(i)-'A']++;
}
}
return count==rlen;
}
}
- 第二种
较为常规的数组做法,两次循环对比
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
int[] count = new int[26];
for(char ch: magazine.toCharArray()){
count[ch-'a']++;
}
for(char ch: ransomNote.toCharArray()){
if(count[ch-'a']==0) return false;
else count[ch-'a']--;
}
return true;
}
}
- 第三种
来自力扣大神的分享,核心是indexOf()的用法:计算返回第一次出现该字符的索引,为了防止出现重复的,用了数组来保存该字符上次出现的索引,就保证了下次从上次出现的索引之后再进行查找
class Solution {
public boolean canConstruct(String ransom, String magazine) {
if (magazine.length() < ransom.length()) return false;
int caps[] = new int[26];
for (char c : ransom.toCharArray()) {
int index = magazine.indexOf(c, caps[c - 'a']);
if (index == -1)
return false;
caps[c - 97] = index + 1;
}
return true;
}
}