Find the String with LCP

Hard
Watch on YouTube ↗

Solution

class Solution {
    public String findTheString(int[][] lcp) {
        int n = lcp.length;
        char s[] = new char[n];

        char ch = 'a';
        for(int i=0; i<n; i++) {
            // already assigned by an earlier position that shared a prefix with i
            if(s[i] > 0)
                continue;
            if(ch > 'z')
                return "";
            s[i] = ch;
            // lcp[i][j] > 0 means s[i]==s[j], propagate the same char
            for(int j=i+1; j<n; j++) {
                if(lcp[i][j] > 0) {
                    s[j] = s[i];
                }
            }
            ch++;
        }

        // verify s produces the given lcp using: lcp[i][j] = 1 + lcp[i+1][j+1] if s[i]==s[j], else 0
        for(int i=0; i<n; i++) {
            for(int j=0; j<n; j++) {
                int prefix;
                if(s[i]==s[j]) {
                    int prevpref = 0;
                    if(i==n-1 || j==n-1)
                        prevpref = 0;
                    else prevpref = lcp[i+1][j+1];
                    prefix = 1+prevpref;
                }
                else prefix = 0;
                if(prefix!=lcp[i][j])
                    return "";
            }
        }

        return String.valueOf(s);
    }
}