活跃农民
- 积分
- 394
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2018-3-21
- 最后登录
- 1970-1-1
|
Random note 写了一下 没有跑可能有runtime error 请教一下思路是不是对的?
- Map<String, boolean> seen = new HashMap<>();
- Set<Integer> used = new HashSet<>();
- Map<Integer, List<Integer>> map = new HashMap<>();
- boolean[] checked;
- int[] tar;
- public boolean randomNote(List<String> l, String target) {
- if (target.length() > l.size()) return false;
- checked = new boolean[target.length()];
- int tari = 0;
- for (char c : target.toCharArray()) {
- int dif = c - ‘a’;
- if (!map.containsKey(dif)) map.put(dif, new LinkedList<>());
- tar[tari] = dif;
- }
- for (int i = 0; i < l.size(); i++) {
- String s = l.get(i);
- for (char c : s.toCharArray()) {
- int d = c - ‘a’;
- if (map.containsKey(d)) map.get(d).put(i);
- }
- }
- return dfs(0);
- }
- private boolean dfs(int s) {
- if (s > tar.length) return true;
- String key = format(s);
- if (seen.containsKey(key)) return seen.get(key);
- for (int toUse : map.get(tar[s])) {
- if (!seen.contains(toUse)) {
- used.add(toUse);
- if (dfs(s + 1)) {
- seen.put(key, true);
- used.remove(toUse);
- return true;
- }
- used.remove(toUse);
- }
- }
- map.put(key, false);
- return false;
- }
- private String format(int s) {
- StringBuilder sb = new StringBuilder();
- for (int i = s; i < tar.length; i++) {
- sb.append(tar[i] + “ “ );
- for (int cand : map.get(tar[i])) {
- if (!used.contains(cand)) {
- sb.append(cand + “ “);
- }
- }
- }
- return sb.toString();
- }
复制代码
补充内容 (2019-3-12 09:29):
不知道为什么格式转化被划掉了。。。大家将就看一下 |
|