给你两个字符串:ransomNote
和 magazine
,判断 ransomNote
能不能由 magazine
里面的字符构成。如果可以,返回 true
;否则返回 false
。magazine
中的每个字符只能在 ransomNote
中使用一次。
示例 1:
输入:ransomNote = "a", magazine = "b" 输出:false
一 哈希:
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
if (ransomNote.length() > magazine.length()) {
return false;
}
int[] cnt = new int[26];
for (char c : magazine.toCharArray()) {
cnt[c - 'a']++;
}
for (char c : ransomNote.toCharArray()) {
cnt[c - 'a']--;
if(cnt[c - 'a'] < 0) {
return false;
}
}
return true;
}
}
二:
public boolean canConstruct(String ransomNote, String magazine) {
for (int i = 0; i < ransomNote.length(); i++) {
String c = String.valueOf(ransomNote.charAt(i));
if (magazine.contains(c)) {
magazine = magazine.replaceFirst(c, "");
} else {
return false;
}
}
return true;
}
给定一种规律 pattern
和一个字符串 s
,判断 s
是否遵循相同的规律。
这里的 遵循 指完全匹配,例如, pattern
里的每个字母和字符串 s
中的每个非空单词之间存在着双向连接的对应规律。
示例1:
输入: pattern ="abba"
, s ="dog cat cat dog"
输出: true
public boolean wordPattern(String pattern, String s) {
String[] split = s.split(" ");
if(pattern.length()!=split.length)
return false;
Map<String,Character> map=new HashMap<>();
Set<Character> set=new HashSet<>();
for(int i=0;i<split.length;i++){
if(map.containsKey(split[i])){
if(map.get(split[i])!=pattern.charAt(i))
return false;
}
else {
if(set.contains(pattern.charAt(i)))
return false;
map.put(split[i], pattern.charAt(i));
set.add(pattern.charAt(i));
}
}
return true;
}