Problem-17

python

Question

This problem was asked by Google. Suppose we represent our file system by a string in the following manner: The string "dir\n\tsubdir1\n\tsubdir2\n\t\tfile.ext" represents: dir subdir1 subdir2 file.ext The directory dir contains an empty sub-directory subdir1 and a sub-directory subdir2 containing a file file.ext. The string "dir\n\tsubdir1\n\t\tfile1.ext\n\t\tsubsubdir1\n\tsubdir2\n\t\tsubsubdir2\n\t\t\tfile2.ext" represents: dir subdir1 file1.ext subsubdir1 subdir2 subsubdir2 file2.ext The directory dir contains two sub-directories subdir1 and subdir2. subdir1 contains a file file1.ext and an empty second-level sub-directory subsubdir1. subdir2 contains a second-level sub-directory subsubdir2 containing a file file2.ext. We are interested in finding the longest (number of characters) absolute path to a file within our file system. For example, in the second example above, the longest absolute path is "dir/subdir2/subsubdir2/file2.ext", and its length is 32 (not including the double quotes). Given a string representing the file system in the above format, return the length of the longest absolute path to a file in the abstracted file system. If there is no file in the system, return 0. Note: The name of a file contains at least a period and an extension. The name of a directory or sub-directory will not contain a period.

                    
							

def find_longest_path_length(path):
	if("." not in path):
		return 0

	length_dict = 	{-1:0}
	max_len = 0
	lines = path.split("\n")
	for line in lines:
		depth = line.count("\t")
		length_dict[depth] = len(line) - depth + length_dict[depth-1]

		if '.' in line:
			max_len = max(max_len, length_dict[depth]+depth)

	return max_len


if __name__ == "__main__":
	path1 = "dir\n\tsubdir1\n\t\tfile1.ext\n\t\tsubsubdir1\n\tsubdir2\n\t\tsubsubdir2\n\t\t\tfile2.ext"
	path2 = "dir\n\tsubdir1\n\tsubdir2\n\t\tfile.ext"
	path3 = "dir\n\tsubdir1\n\tsubdir2" # No file
	assert(find_longest_path_length(path1) == 32)
	assert(find_longest_path_length(path2) == 20)
	assert(find_longest_path_length(path3) == 0)