通过万岁!!!
- 题目:简单的理解,就是给你两个字符串,看第一个字符串的字符能不能由第二个的字符串中的字符拼接形成,不能重复使用,但是可以多。例如第一个是abb,第二个是aab,那就不行。第二个必须包含两个b一个a。
- 思路:两次遍历,第一个记录我们有的资源,第二次遍历目标,每次用一个就–;
- 技巧:用int数组去存储,当然可以用map,但是map相比较起来比较麻烦,并且题目中说了26个小写字母。如果是没有说的话,那最好用map。
伪代码
定义数组,长度为26。
for 遍历第二个字符串
每次遍历到一个字符,就在对应的下标的位置进行++
for 遍历第一个字符串
如果数组中的内容是0了
return false;
否则
对应的数组的值--;
return true;
java代码
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
int sign[] = new int[26];
for (int i = 0; i < magazine.length(); i++)
sign[magazine.charAt(i) - 97]++;
for (int i = 0; i < ransomNote.length(); i++)
if (sign[ransomNote.charAt(i) - 97] == 0) return false;
else sign[ransomNote.charAt(i) - 97]--;
return true;
}
}
- 总结:没有什么难度,这个就是按照基本思路来就可以了。这里主要是注意什么时候用map,一般如果不知道需要多长的数组的时候,用map。但是这里知道了,所以用数组会更好,并且这里定义的数组一般是顺序的,所以查找的速度也是很快的。map的是数组加红黑树,其实查找起来还是有点复杂度。