1.题目
给你两个字符串:ransomNote
和 magazine
,判断 ransomNote
能不能由 magazine
里面的字符构成。
如果可以,返回 true
;否则返回 false
。
magazine
中的每个字符只能在 ransomNote
中使用一次。
2.示例
编辑
编辑
3.思路
统计字符:
首先观察字符串很明显,如果ransomNote的长度大于magazine的时候则一定返回false。然后由于字符串都是由小写字母组成。那么可以创建两个int型数组,用来记录两个字符串英文字母出现的次数。最后只需要比较两个数组的值,只要ransomNote中的统计数不会大于magazine的字母统计数。
4.代码
LeetCode代码:
class Solution { public boolean canConstruct(String ransomNote, String magazine) { if (ransomNote.length()>magazine.length()){ return false; } int ransomNotes[] = new int[26]; int magazines[] = new int[26]; for (int i:ransomNote.toCharArray()) { ransomNotes[i-'a']++; } for (int j:magazine.toCharArray()) { magazines[j-'a']++; } for (int i=0;i<26;i++){ if (ransomNotes[i]>magazines[i]){ return false; } } return true; } }
编辑
案例详细代码:
package Example12_1; public class javaDemo { public static void main(String[] args) { String ransomNote ="aa"; String magazine ="ab"; boolean flag = true; // 判断特殊情况 if (ransomNote.length()>magazine.length()){ flag = false; } // 创建统计字母的整数型数组 int ransomNotes[] = new int[26]; int magazines[] = new int[26]; // 分别进行统计字母与个数,注意这里虽然用toCharArray创建了匿名字符数组 // 匿名字符数组在执行完毕功能后后会自动被系统垃圾回收,达到减少空间的目的 for (int i:ransomNote.toCharArray()) { ransomNotes[i-'a']++; } for (int j:magazine.toCharArray()) { magazines[j-'a']++; } // 两者数组之间的比较,如果出现ransomNotes的元素要大于magazines的则返回false for (int i=0;i<26;i++){ if (ransomNotes[i]>magazines[i]){ flag = false; break; } } System.out.println(flag); } }