其实做的粗糙一点,去掉 c = c[:-1] 这句也能实现,而且少一个字符串处理性能会更好。毕竟我们不在意文件内容实际是什么,只在意有没有重复。
classSolution: deffindDuplicate(self, paths: List[str]) -> List[List[str]]: table = defaultdict(list) for f in paths: f = f.split(" ") p = f[0] for i in f[1:]: fn, c = i.split("(") c = c[:-1] table[c].append(f"{p}/{fn}") ans = [] for v in table.values(): iflen(v) > 1: ans.append(v) return ans
Java 例子。
classSolution{ public List<List<String>> findDuplicate(String[] paths) { Map<String, List<String>> table = new HashMap<>(); for (String p : paths) { String[] f = p.split(" "); String pr = f[0]; for (int i = 1; i < f.length; i++) { String[] file = f[i].split("\\("); if (!table.containsKey(file[1])) { table.put(file[1], new ArrayList<String>()); } table.get(file[1]).add(pr + "/" + file[0]); } } List<List<String>> ans = new ArrayList<>(); for (List<String> val : table.values()) { if (val.size() > 1) { ans.add(val); } } return ans; } }
JS 例子。
/** * @param {string[]}paths * @return {string[][]} */ var findDuplicate = function (paths) { table = {}; for (let p of paths) { p = p.split(' '); const pr = p[0]; for (let i = 1; i < p.length; i++) { const file = p[i].split('('); if (!table[file[1]]) table[file[1]] = []; table[file[1]].push(pr + '/' + file[0]); } } const ans = []; for (let k in table) { if (table[k].length > 1) { ans.push(table[k]); } } return ans; };