643. System Longest File Path

题其实不难,难的地方是你能写多“少”的代码,处理字符串的问题,傻傻的自己处理的话肯定需要大量代码,如何分析当前字符等。如何存储之前的还有用的文件夹结构也是很重要的一部分来使这道题的代码量减少。

HashMap拯救世界。

由于题目的特殊性,出现过的文件夹只能在其后面有其子文件夹,如果换到其他文件夹以后就不会再折回来了。所以就不用在乎也不用再记录访问过的文件夹的长度是多少了。这里hashmap用来保存level和相对应当前此level的长度。

这里需要注意的一点是\t 和 \n 并不是两个字符组成的,而是一个。

现将整个字符串按照\n 来split,得到的每一个子字符串,通过其\t的个数就可以知道它属于第几个level。这个处理是本题的精华部分之一。精华部分之二就是存在hashmap和取出的操作。

利用java特性,我们可以知道有多少个\t,然后给定level值。剩下的自字符串的长度就是自己的真正的长度。这个level值正好就是第一个不是\t的index,所以我们用lastIndexOf(“\t”)+1。真正的长度len就正好是在index以后取substring的长度。

有一个注意的地方是在保存本level的长度的时候需要加1再存入,因为最后path是写成a/b/c如此的,加的1就是那个/

首先要把hashmap里存上0,0 因为level为0的时候没有字符,这样也为了以后的处理方便。

核心代码:

String[] folders = input.split(“\n”);
 HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
 int max = 0;
 map.put(0,0);
 
 for(int i=0; i<folders.length; i++){
 String folder = folders[i];
 int level = folder.lastIndexOf(“\t”)+1;
 int len = folder.substring(level).length();
 if(folder.contains(“.”)){
 max = Math.max(map.get(level)+len, max); 
 }
 else{
 map.put(level+1, map.get(level)+len+1);
 }
 }
 
 return max;

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.