diff --git a/challenges/intermediate/longest-palindromic-substring/long-palin.py b/challenges/intermediate/longest-palindromic-substring/long-palin.py new file mode 100644 index 0000000..1a9ade5 --- /dev/null +++ b/challenges/intermediate/longest-palindromic-substring/long-palin.py @@ -0,0 +1,41 @@ +def find_long_palin_substr(string: str) -> str: + max_length: int = 1 + + start = 0 + length = len(string) + max_even_substr, max_odd_substr = string[0], string[0] + + for i in range(1, length): + # use i as index center for even subs + even_substr, start, max_length = find_palin_substr(string, start, length, max_length, low=(i-1), high=i) + + # use i as index center for odd subs + odd_substr, start, max_length = find_palin_substr(string, start, length, max_length, low=(i-1), high=(i+1)) + + if len(even_substr) > len(max_even_substr): + max_even_substr = even_substr + if len(odd_substr) > len(max_odd_substr): + max_odd_substr = odd_substr + + return max_even_substr if len(max_even_substr) >= len(max_odd_substr) else max_odd_substr + + +def find_palin_substr(string: str, start: int, length: int, max_length: int, low: int, high: int) -> tuple: + + while low >= 0 and high < length and string[low] == string[high]: + low -= 1 + high += 1 + + low += 1 + high -= 1 + if (string[low] == string[high]) and ((high - low + 1) > max_length): + start = low + max_length = high - low + 1 + + return string[start:start + max_length], start, max_length + + +if __name__ == "__main__": + stringList = ["babad", "cbbd", "a", "ac"] + for s in stringList: + print("String:\t{}\nPalindromic substring:\t{}\n".format(s, find_long_palin_substr(s))) diff --git a/challenges/intermediate/longest-palindromic-substring/long-palin.ts b/challenges/intermediate/longest-palindromic-substring/long-palin.ts new file mode 100644 index 0000000..96bc796 --- /dev/null +++ b/challenges/intermediate/longest-palindromic-substring/long-palin.ts @@ -0,0 +1,58 @@ +function find_palin_substr (string: string, start: number, low: number, high: number, length: number, max_length: number) { + while (low >= 0 && high < length && (string[low] === string[high])) { + low -= 1; + high += 1; + } + + low += 1; + high -= 1; + + if ((string[low] === string[high]) && ((high - low + 1) > max_length)) { + start = low; + max_length = high - low + 1; + } + + return [string.slice(start, start + max_length), start, max_length] +} + +function find_long_palin_substr (string: string) { + + let max_length: number = 1; + let start: number = 0; + let length: number = string.length; + let max_even_substr: string = string[0]; + let max_odd_substr: string = string[0]; + let even_substr: string; + let odd_substr: string; + let find_palin_return = []; + + for (let i = 1; i < length; i++) { + // use i as index center for even subs + find_palin_return = find_palin_substr(string, start, i-1, i, length, max_length); + even_substr = find_palin_return[0].toString(); + start = Number(find_palin_return[1]); + max_length = Number(find_palin_return[2]); + + // use i as index center for odd subs + find_palin_return = find_palin_substr(string, start, i-1, i+1, length, max_length); + odd_substr = find_palin_return[0].toString(); + start = Number(find_palin_return[1]); + max_length = Number(find_palin_return[2]); + + if (even_substr.length > max_even_substr.length) { + max_even_substr = even_substr + } + if (odd_substr.length > max_odd_substr.length) { + max_odd_substr = odd_substr + } + } + + if (max_even_substr.length > max_odd_substr.length) { + return max_even_substr + } else return max_odd_substr +} + +console.log(find_long_palin_substr("cbbd")); +console.log(find_long_palin_substr("babad")); +console.log(find_long_palin_substr("a")); +console.log(find_long_palin_substr("ac")); \ No newline at end of file