【发布时间】:2021-07-15 19:20:54
【问题描述】:
我正在尝试383. Ransom Note LeetCode 挑战:
给定两个字符串
ransomNote和magazine,如果ransomNote可以从magazine构造,则返回true,否则返回false。
magazine中的每个字母在ransomNote中只能使用一次。示例1:
Input: ransomNote = "a", magazine = "b" Output: false示例2:
Input: ransomNote = "aa", magazine = "ab" Output: false示例3:
Input: ransomNote = "aa", magazine = "aab" Output: true
这是我对上述 LeetCode 问题的解决方案:
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
if (ransomNote==null || ransomNote.length() == 0) return true;
if (magazine==null || magazine.length() == 0) return false;
boolean flag=false;
boolean visited[]=new boolean[magazine.length()];
Arrays.fill(visited,Boolean.FALSE);
for(int i=0;i<ransomNote.length();i++){
flag=false;
for(int j=0;j<magazine.length();j++){
if(ransomNote.charAt(i)==magazine.charAt(j) && !visited[j] ){
visited[j]=true;
flag=true;
break;
}
}
}
return flag;
}
}
我能够通过 126 个案例中的 110 个,但代码中存在一些小错误。即使在我的试运行中我也找不到错误。
未通过的测试用例:
Input:
"fihjjjjei"
"hjibagacbhadfaefdjaeaebgi"
Output: true
Expected: false
【问题讨论】:
-
这是 java 不是 c。
-
我很惊讶您的代码通过了与您所说的一样多的案例。该代码本质上只是检查赎金票据的最后一个字母。那是因为您将每个字母的
flag设置为false,然后在找到未访问的匹配项时将其设置为true。所以最终的flag值只取决于最后一个字母的结果。 -
那我该怎么办???
-
再想想你的逻辑?
-
您可以修补已有的代码,或者从头开始使用全新的设计。我推荐后者。提示:
counting sets用于杂志和赎金票据。
标签: java algorithm for-loop data-structures