890. 查找和替换模式【中等题】【每日一题】
思路:【哈希表模拟】
见代码注释
代码:
class Solution {
public List<String> findAndReplacePattern(String[] words, String pattern) {
List<String> ans = new ArrayList<>();
//求出pattern模式的模板mode
String mode = make(pattern);
for (String word : words) {
//求出每个单词的模式,判断其是否与mode相等,相等则将word添加到ans列表中
if (mode.equals(make(word))){
ans.add(word);
}
}
return ans;
}
/**
* 利用哈希表模拟出传入单词word的模式
* @param word 传入单词
* @return 返回传入单词的模式
*/
public String make(String word){
StringBuilder sb = new StringBuilder();
//记录当前单词中出现的字母,及其对应的模式字母
Map<Character,Character> map = new HashMap<>();
char ch = 'A';
char[] chars = word.toCharArray();
//第一次遍历,找出单词中存在的字母,及其对应的模式字母
for (char c : chars) {
if (!map.containsKey(c)){
map.put(c,ch++);
}
}
//第二次遍历,根据map中记录的字母及其模式字母,模拟出当前单词对应的模式
for (char c : chars) {
sb.append(map.get(c));
}
return sb.toString();
}
}
剑指 Offer II 080. 含有 k 个元素的组合【中等题】
思路:【二进制模拟】
用二进制数来模拟从1
到n
这n
个数,统计当前二进制数中1
的个数,如果有k
个1
,说明我们找到了一个含k
个元素的组合,将这个二进制数从右到左依次编号为1,2,...n,
取出1
对应的编号,将其添加到list
集合中,最后将list
集合添加进入ans
答案列表中。
代码:
class Solution {
public List<List<Integer>> combine(int n, int k) {
List<List<Integer>> ans = new ArrayList<>();
int mask = 1 << n;
for (int i = 0; i < mask; i++) {
if (Integer.bitCount(i) == k){
List<Integer> list = new ArrayList<>();
int n1 = i,num = 1;
while (n1 != 0){
if ((n1 & 1) == 1){
list.add(num);
}
num++;
n1 >>= 1;
}
ans.add(new ArrayList<>(list));
}
}
return ans;
}
}