《中英双解》leetCode 383 Ransom Note(赎金信)

Given two stings ransomNote and magazine, return true if ransomNote can be constructed from magazine and false otherwise.

Each letter in magazine can only be used once in ransomNote.

给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。如果可以构成,返回 true ;否则返回 false。

(题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。杂志字符串中的每个字符只能在赎金信字符串中使用一次。)

Example 1:

Input: ransomNote = "a", magazine = "b"
Output: false

Example 2:

Input: ransomNote = "aa", magazine = "ab"
Output: false

Example 3:

Input: ransomNote = "aa", magazine = "aab"
Output: true

Constraints:

  • 1 <= ransomNote.length, magazine.length <= 105
  • ransomNote and magazine 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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值