2017-02-11 61 views
6

我實現了以下方法來查找最長的絕對文件路徑。使用java查找最長的絕對文件路徑

public static int lengthLongestPath(String input) { 
    HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(); 
    if (input.length() == 0) return 0; 
    int maxLength = 0; 
    int subStringLength = 0; 
    int previousLevel = 0; 
    String[] paths = input.split("\n"); 
    for (String path : paths) { 
     String[] substr = path.split("\t"); 
     String dirOrFile = substr[substr.length-1]; 
     int level = substr.length -1; 

     if(level <= previousLevel && level !=0){ 
      previousLevel = level-1; 
      subStringLength = map.get(previousLevel); 
     }else if(level ==0){ 
      subStringLength = 0; 
     }else{ 
      previousLevel = level; 
     } 
     subStringLength += dirOrFile.length(); 
     if(dirOrFile.contains(".")){ 
      maxLength = Math.max(subStringLength+level, maxLength); 
     } 
     map.put(level, subStringLength); 
    } 
    return maxLength; 
} 

但是,它對於以下輸入是失敗的。預期的輸出是528,但我的輸出是549

"sladjf\n\tlkjlkv\n\t\tlkjlakjlert\n\t\t\tlaskjglaksjf\n\t\t\t\tlakjgfljrtlj\n\t\t\t\t\tlskajflakjsvlj\n\t\t\t\t\t\tlskgjflkjrtlrjt\n\t\t\t\t\t\t\tlkjglkjlvkjdlvkj\n\t\t\t\t\t\t\t\tlfjkglkjfljdlv\n\t\t\t\t\t\t\t\t\tlkdfjglerjtkrjkljsd.lkvjlkajlfk\n\t\t\t\t\t\t\tlskfjlksjljslvjxjlvkzjljajoiwjejlskjslfj.slkjflskjldfkjoietruioskljfkljf\n\t\t\t\t\tlkasjfljsaljlxkcjzljvl.asljlksaj\n\t\t\t\tasldjflksajf\n\t\t\t\talskjflkasjlvkja\n\t\t\t\twioeuoiwutrljsgfjlskfg\n\t\t\t\taslkjvlksjvlkjsflgj\n\t\t\t\t\tlkvnlksfgk.salfkjaslfjskljfv\n\t\t\tlksdjflsajlkfj\n\t\t\tlasjflaskjlk\n\t\tlsakjflkasjfkljas\n\t\tlskjvljvlkjlsjfkgljfg\n\tsaljkglksajvlkjvkljlkjvksdj\n\tlsakjglksajkvjlkjdklvj\n\tlskjflksjglkdjbkljdbkjslkj\n\t\tlkjglkfjkljsdflj\n\t\t\tlskjfglkjdfgkljsdflj\n\t\t\t\tlkfjglksdjlkjbsdlkjbk\n\t\t\t\t\tlkfgjlejrtljkljsdflgjl\n\t\t\t\t\tsalgkfjlksfjgkljsgfjl\n\t\t\t\t\tsalkflajwoieu\n\t\t\t\t\t\tlaskjfglsjfgljkkvjsdlkjbklds\n\t\t\t\t\t\t\tlasjglriotuojgkjsldfgjsklfgjl\n\t\t\t\t\t\t\t\tlkajglkjskljsdljblkdfjblfjlbjs\n\t\t\t\t\t\t\t\t\tlkajgljroituksfglkjslkjgoi\n\t\t\t\t\t\t\t\t\t\tlkjglkjkljkljdkbljsdfljgklfdj\n\t\t\t\t\t\t\t\t\t\t\tlkjlgkjljgslkdkldjblkj\n\t\t\t\t\t\t\t\t\t\t\t\tlkjfglkjlkjbsdklj.slgfjalksjglkfjglf\n\t\t\t\t\t\t\t\t\t\t\t\tlkasjrlkjwlrjljsl\n\t\t\t\t\t\t\t\t\t\t\t\t\tlksjgflkjfklgjljbljls\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tlkjsglkjlkjfkljdklbjkldf\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tlkjglkjdlsfjdglsdjgjlxljjlrjsgjsjlk\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tlkjsgkllksjfgjljdslfkjlkasjdflkjxcljvlkjsgkljsfg\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tlaskjlkjsakljglsdjfgksdjlkgjdlskjb\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tlkajsgfljfklgjlkdjgfklsdjklj\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tlkjfglkjlkgjlkjl.aslkjflasjlajglkjaf\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tlkjasflgjlskjglkfjgklgsdjflkbjsdklfjskldfjgklsfdjgklfdjgl\n\tlskadjlkjsldwwwwwfj\n\t\tlkjflkasjlfjlkjajslfkjlasjkdlfjlaskjalvwwwwwwwwwwwwwwwkjlsjfglkjalsjgflkjaljlkdsjslbjsljksldjlsjdlkjljvblkjlkajfljgasljfkajgfljfjgldjblkjsdljgsldjg.skljf" 

有人能幫我找到我的代碼的問題。

給出一些關於字符串格式的背景 以下字符串表示:以下文件路徑。

"dir\n\tsubdir1\n\t\tfile1.ext\n\t\tsubsubdir1\n\tsubdir2\n\t\tsubsubdir2\n\t\t\tfile2.ext" 

dir 
subdir1 
    file1.ext 
    subsubdir1 
subdir2 
    subsubdir2 
     file2.ext 

回答

1

簡化現有代碼給出了下面,它返回正確的結果爲您的兩個例子:

public static int lengthLongestPath(String input) { 
    if (input.length() == 0) 
     return 0; 
    Map<Integer, Integer> map = new HashMap<>(); 
    int maxLength = 0; 
    String[] paths = input.split("\n"); 
    for (String path : paths) { 
     String dirOrFile = path.replaceFirst("\\t*", ""); 
     int level = path.lastIndexOf("\t") + 1; 

     int prefixLength = 0; 
     if (level > 0) { 
      prefixLength = map.get(level - 1); 
     } 

     int pathLength = prefixLength + dirOrFile.length(); 
     if (dirOrFile.contains(".")) { 
      maxLength = Math.max(pathLength + level, maxLength); 
     } 
     map.put(level, pathLength); 
    } 
    return maxLength; 
} 
+0

問題期望您計算文件夾和文件之間的「\」字符。因此+級別。在你的解決方案中,這不是正確的? – user77005

+0

對。我相應地修改了我的解決方案。如預期的那樣,結果是528。 –

+0

謝謝你的工作。我不知道爲什麼我很複雜的計算前綴長度:) – user77005

0

我想你可能是過於複雜的事情。由於字符串的格式,你不能「返回」你已經離開的目錄,所以你不需要保留一張地圖。另一種實現方式可以由\n字符分割字符串並用一個列表來跟蹤你的路徑,其中的\t字符數表示的位置,你需要保持:

public static int lengthLongestPath(String input) { 
    int maxLen = 0; 
    List<String> currPath = new LinkedList<>(); 
    String[] parts = input.split("\n"); 
    for (String part : parts) { 
     int numTabs = Math.max(0, part.lastIndexOf('\t')); 
     part = part.substring(numTabs + 1); 
     currPath = currPath.subList(0, numTabs); 
     currPath.add(part); 
     int curLen = currPath.stream().mapToInt(String::length).sum(); 
     maxLen = Math.max(maxLen, curLen); 
    } 
    return maxLen; 
}