A couple strange things are happening to me with this challenge. If you wish to take a look at the requirements and provide some insights you can find it at: https://leetcode.com/problems/longest-absolute-file-path/?tab=Description
As you can see there are a couple of sample strings. They are:
dir\n\tsubdir1\n\tsubdir2\n\t\tfile.ext
dir\n\tsubdir1\n\t\tfile1.ext\n\t\tsubsubdir1\n\tsubdir2\n\t\tsubsubdir2\n\t\t\tfile2.ext
Allow me to show a screen capture of the Eclipse IDE console:
main <<< java.runtime.version ==>1.8.0_121-b13<==
dir\n\tsubdir1\n\tsubdir2\n\t\tfile.ext
dir\n\tsubdir1\n\t\tfile1.ext\n\t\tsubsubdir1\n\tsubdir2\n\t\tsubsubdir2\n\t\t\tfile2.ext
dir\n\tsubdir1\n\tsubdir2\n\tsubdir3
aaaaaaaaaaaaaaaaaaaaa\n\tsth.png
a\n\taa\n\t\taaa\n\t\t\tfile1.txt
-1
main <<< fs ==>dir\n\tsubdir1\n\tsubdir2\n\t\tfile.ext<==
main <<< length: 20
main <<< fs ==>dir\n\tsubdir1\n\t\tfile1.ext\n\t\tsubsubdir1\n\tsubdir2\n\t\tsubsubdir2\n\t\t\tfile2.ext<==
main <<< length: 32
main <<< fs ==>dir\n\tsubdir1\n\tsubdir2\n\tsubdir3<==
main <<< length: 0
main <<< fs ==>aaaaaaaaaaaaaaaaaaaaa\n\tsth.png<==
main <<< length: 29
main <<< fs ==>a\n\taa\n\t\taaa\n\t\t\tfile1.txt<==
main <<< length: 18
main <<< fs ==>-1<==
As usual, I wrote a test program and from it I built the solution. I always like to use a TDD approach.
The source code for main() in Java follows:
/**
* Test code.
*/
public static void main(String[] args) {
// **** display Java runtime version ****
System.out.println(“main <<< java.runtime.version ==>” + System.getProperty(“java.runtime.version”) + “<==”);
// **** ****
String fs;
// **** open scanner ****
Scanner sc = new Scanner(System.in);
do {
// **** read file system ****
fs = sc.next();
System.out.println(“main <<< fs ==>” + fs + “<==”);
// **** length of the longest absolute path to file ****
if (!fs.equals(“-1”)) {
System.out.println(“main <<< length: ” + lengthLongestPath(fs));
}
} while (!fs.equals(“-1”));
// **** close scanner ****
sc.close();
}
The first lines display the version of Java I am using. If there is an issue or changes that might impact what I am observing please let me now.
As you can tell, I input most of the paths discussed in the LeetCode challenge. Of interest is the first one.
It seems to me that my code might have lots of issues but seems to work with the sample first line. After copying the code to the web site and clicking on the <Run Code> button (repeated with minor modifications a dozen or so times) I get the following:
Your input
“dir\n\tsubdir1\n\tsubdir2\n\t\tfile.ext”
Your answer
32
Expected answer
20
Seems to me that the first path I am using for testing matches what is on the requirements section at the web site and matches the test case that failed :o(
Please take a look at my Java code which is working on my computer but failing at LeetCode:
/**
* Determine if this path is a directory.
*/
static boolean isDirectory(String path) {
return !path.contains(“.”);
}
/**
* Determine the directory level.
*/
static int dirLevel(String name) {
// ???? strange behaviour ????
String delim = “\\t”;
String[] split = name.split(Pattern.quote(delim));
// **** ****
return split.length – 1;
}
/**
* Build full path.
*/
static String buildFullPath(Stack<String> pathStack, String fileName) {
String fullPath = “”;
for (int i = 0; i < pathStack.size(); i++) {
fullPath += pathStack.elementAt(i);
fullPath += “/”;
}
return fullPath += fileName;
}
/**
* An implementation.
*/
static int lengthLongestPath(String input) {
int maxLength = 0;
int currentLevel = -1;
Stack<String> pathStack = new Stack<String>();
int level;
String delim;
// ???? strange behavior by String.split() ????
delim = “\\n”;
String[] paths = input.split(Pattern.quote(delim));
// **** ****
for (String s : paths) {
// **** get the directory level ****
level = dirLevel(s);
// ???? remove \t from file name (strange behavior by String.replaceAll() ????
delim = “\\t”;
s = s.replaceAll(Pattern.quote(delim), “”);
// **** is this a file or folder ****
if (isDirectory(s)) {
// **** adjust the directory path stack ****
for ( ; currentLevel >= level; currentLevel–) {
pathStack.pop();
}
// **** push current directory and adjust current directory level ****
pathStack.push(s);
currentLevel++;
}
// **** this is a file ****
else {
// **** build the full path of the file ****
String fullPath = buildFullPath(pathStack, s);
// **** compute the length and update the max length (if needed) ****
int length = fullPath.length();
if (length > maxLength) {
maxLength = length;
}
}
}
// **** return the length of the max path ****
return maxLength;
}

I actually implemented two solutions. Both are somewhat similar and both exhibit the same strange results and behavior. As you can see on the actual code, String.split() and String.replaceAll() require the use of Pattern.quote() to work with the delimiter string “\\n”. They do not seem to work with “\n” or “\\n” strings when used without the Pattern.quote() method.
I have restarted a couple times my Eclipse IDE. Given that I have many windows open at this time I have not restarted my computer yet. Will do that over the weekend and if there is a change will update this post.
If you have comments or questions regarding this or any other post in this blog please do not hesitate and send me a message. Will reply as soon as possible and will not use your name unless you explicitly allow me to do so.
John
john.canessa@gmail.com
Follow me on Twitter: @john_canessa