leetcodealgorithms-templates7-dynamic-programming
 
 
 
// Time: O(n^2), Space: O(n)
function longest(s) {
    let length = 0;
 
    for (let i = 0; i < s.length; i++) {
        // odd length
        let l = i, r = i;
        while (l >= 0 && r < s.length && s.charAt(l) == s.charAt(r)) {
            if (r - l + 1 > length) {
                length = r - l + 1;
            }
            l--;
            r++;
        }
 
        // even length
        l = i;
        r = i + 1;
        while (l >= 0 && r < s.length && s.charAt(l) == s.charAt(r)) {
            if (r - l + 1 > length) {
                length = r - l + 1;
            }
            l--;
            r++;
        }
    }
    return length;
}
 
// Same solution, without duplicate code.
// Time: O(n^2), Space: O(n)
function longest2(s) {
    let length = 0;
    for (let i = 0; i < s.length; i++) {
        // odd length
        length = Math.max(length, helper(s, i, i));
        
        // even length
        length = Math.max(length, helper(s, i, i + 1)); 
    }
    return length;
}
 
function helper(s, l, r) {
    let maxLength = 0;
    while (l >= 0 && r < s.length && s.charAt(l) == s.charAt(r)) {
        if (r - l + 1 > maxLength) {
            maxLength = r - l + 1;
        }
        l--;
        r++;
    }
    return maxLength;
}