Given two stings
ransomNote
andmagazine
, returntrue
ifransomNote
can be constructed frommagazine
andfalse
otherwise.Each letter in
magazine
can only be used once inransomNote
.给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。如果可以构成,返回 true ;否则返回 false。
(题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。杂志字符串中的每个字符只能在赎金信字符串中使用一次。)
Example 1:
Input: ransomNote = "a", magazine = "b" Output: falseExample 2:
Input: ransomNote = "aa", magazine = "ab" Output: falseExample 3:
Input: ransomNote = "aa", magazine = "aab" Output: trueConstraints:
1 <= ransomNote.length, magazine.length <= 105
ransomNote
andmagazine
consist of lowercase English letters.
这一题的方法也很简单,我的想法是用暴力法,依次比较两个字符串中的值,不过,需要注意一点的是,我们不能在一个字符串中操作一个数的改变,那需要用到StringBuilder,所以,使用这个方法需要将一个字符串转换为数组进行比较。
先看看不用StringBuilder的方法
public class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
char[] ch = magazine.toCharArray();
for(int i = 0;i < ransomNote.length();i++){
boolean flag = false;
for(int j = 0;j < manazine.length();j++){
if(ransomNate.charAt(i) == ch[j]){
ch[j] = 0;//防止flag的变化
flag = true;
break;
}
}
if(!falg){
return false;
}
}
return true;
}
}
再看看另一种方法
public class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
StringBuilder stringBuilder = new StringBuilder(magazine);
int index = 0;
for(char c : ransomNote.toCharArray()){
//获取c的元素下标
index = stringBuilder.indexOf(String.valueOf(c));
if (index >= 0) {
stringBuilder.deleteCharAt(index);
} else {
return false;
}
}
return true;
}
}
这种思路很巧妙,就是你把下标index的元素删除干净了,你就返回true。