LeetCode 609. 在系统中查找重复文件(哈希)

1. 题目

给定一个目录信息列表,包括目录路径,以及该目录中的所有包含内容的文件,您需要找到文件系统中的所有重复文件组的路径。
一组重复的文件至少包括二个具有完全相同内容的文件。

输入列表中的单个目录信息字符串的格式如下:

"root/d1/d2/.../dm f1.txt(f1_content) f2.txt(f2_content) ... fn.txt(fn_content)"

这意味着有 n 个文件(f1.txt, f2.txt ... fn.txt 的内容分别是 f1_content, f2_content ... fn_content)在目录 root/d1/d2/.../dm 下。注意:n>=1 且 m>=0。如果 m=0,则表示该目录是根目录。

该输出是重复文件路径组的列表。
对于每个组,它包含具有相同内容的文件的所有文件路径。
文件路径是具有下列格式的字符串:

"directory_path/file_name.txt"
示例 1:
输入:
["root/a 1.txt(abcd) 2.txt(efgh)", "root/c 3.txt(abcd)", "root/c/d 4.txt(efgh)", "root 4.txt(efgh)"]
输出:  
[["root/a/2.txt","root/c/d/4.txt","root/4.txt"],["root/a/1.txt","root/c/3.txt"]]
 
注:
最终输出不需要顺序。
您可以假设目录名、文件名和文件内容只有字母和数字,并且文件内容的长度在 [150] 的范围内。
给定的文件数量在 [120000] 个范围内。
您可以假设在同一目录中没有任何文件或目录共享相同的名称。
您可以假设每个给定的目录信息代表一个唯一的目录。目录路径和文件信息用一个空格分隔。
 
超越竞赛的后续行动:

假设您有一个真正的文件系统,您将如何搜索文件?广度搜索还是宽度搜索?
如果文件内容非常大(GB级别),您将如何修改您的解决方案?
如果每次只能读取 1 kb 的文件,您将如何修改解决方案?
修改后的解决方案的时间复杂度是多少?
其中最耗时的部分和消耗内存的部分是什么?如何优化?
如何确保您发现的重复文件不是误报?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-duplicate-file-in-system
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

class Solution {	// C++
public:
    vector<vector<string>> findDuplicate(vector<string>& paths) {
    	unordered_map<string, unordered_set<string>> m;
    	//文件内容, 文件路径集合
    	string content, path, file;
    	for(auto& p : paths) 
    	{
    		content = path = file = "";
    		int i = p.find(' ');
    		path = p.substr(0,i)+"/";//路径
    		bool foundcontent = false;
    		for(i++; i < p.size(); ++i)
    		{
    			if(p[i] == '(')
    			{
    				foundcontent = true;
    				continue;
    			}
    			if(p[i] == ')')
    			{
    				m[content].insert(path+file);//记录内容包含的路径文件
    				foundcontent = false;
    				content = file = "";
    				i++;//跳过空格
    				continue;
    			}
    			if(!foundcontent)
    				file += p[i];
    			else
    				content += p[i];
    		}
    	}
    	vector<vector<string>> ans;
    	for(auto& mi : m)
    	{
    		if(mi.second.size() >= 2)
    			ans.push_back(vector<string>(mi.second.begin(), mi.second.end()));
    	}
    	return ans;
    }
};

212 ms 36.1 MB

class Solution:# py3
    def findDuplicate(self, paths: List[str]) -> List[List[str]]:
        m = {};
        for p in paths:
            i = p.find(' ')
            content, path, file = "","",""
            path = p[0:i]+'/'
            foundcontent = False
            i += 1
            while i < len(p):
                if p[i]=='(':
                    foundcontent = True
                    i += 1
                    continue
                if p[i]==')':
                    if content not in m:
                        m[content] = set()
                    m[content].add(path+file)
                    foundcontent = False
                    content, file = "", ""
                    i += 2
                    continue
                if not foundcontent:
                    file += p[i]
                else:
                    content += p[i]
                i += 1
        ans = []
        for content in m:
            if len(m[content]) >= 2:
                ans.append(list(m[content]))
        return ans

332 ms 25.7 MB

猜你喜欢

转载自blog.csdn.net/qq_21201267/article/details/106932074