Longest Palindromic Substring in DSA C# - Time & Space Complexity
We want to understand how the time needed grows when finding the longest palindromic substring in a string.
How does the work increase as the string gets longer?
Analyze the time complexity of the following code snippet.
public string LongestPalindrome(string s) {
int start = 0, maxLength = 1;
for (int i = 0; i < s.Length; i++) {
ExpandAroundCenter(s, i, i, ref start, ref maxLength); // odd length
ExpandAroundCenter(s, i, i + 1, ref start, ref maxLength); // even length
}
return s.Substring(start, maxLength);
}
private void ExpandAroundCenter(string s, int left, int right, ref int start, ref int maxLength) {
while (left >= 0 && right < s.Length && s[left] == s[right]) {
left--;
right++;
}
int length = right - left - 1;
if (length > maxLength) {
start = left + 1;
maxLength = length;
}
}
This code finds the longest palindrome by expanding around each character and its neighbor.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Expanding around centers to check palindrome substrings.
- How many times: For each character (n times), we expand outwards which can take up to n steps in worst case.
For a string of length n, we do about 2 expansions per character, each expansion can go up to n steps.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 200 checks |
| 100 | About 20,000 checks |
| 1000 | About 2,000,000 checks |
Pattern observation: The work grows roughly with the square of the input size.
Time Complexity: O(n²)
This means if the string doubles in length, the work to find the longest palindrome roughly quadruples.
[X] Wrong: "Checking palindromes around each center is just O(n) because we only loop once."
[OK] Correct: Each center expansion can itself take up to n steps, so the total work is much more than a single loop.
Understanding this time complexity helps you explain why some palindrome solutions are slower and shows your grasp of nested operations.
"What if we used dynamic programming to store palindrome checks? How would the time complexity change?"
Practice
Longest Palindromic Substring problem?Solution
Step 1: Understand the problem definition
The problem asks to find the longest substring within a given string that is a palindrome, meaning it reads the same forwards and backwards.Step 2: Differentiate from similar problems
Counting all palindromic substrings or reversing the string are different tasks. The focus here is on the longest palindromic substring only.Final Answer:
Find the longest substring that reads the same forwards and backwards -> Option AQuick Check:
Longest palindromic substring = Find the longest substring that reads the same forwards and backwards [OK]
- Confusing substring with subsequence
- Counting all palindromes instead of longest
- Trying to reverse entire string
dp for dynamic programming in the Longest Palindromic Substring problem?Solution
Step 1: Understand C# array syntax
In C#, a 2D array is declared astype[,] name = new type[size1, size2];. bool[,] dp = new bool[s.Length, s.Length]; uses this correct syntax.Step 2: Identify incorrect syntax
bool[][] dp = new bool[s.Length][]; declares jagged arrays but misses initializing inner arrays. bool dp[][] = new bool[s.Length][s.Length]; uses invalid syntax for C#. bool dp = new bool[s.Length, s.Length]; tries to declare a single boolean variable with array sizes, which is invalid.Final Answer:
bool[,] dp = new bool[s.Length, s.Length]; -> Option CQuick Check:
2D array in C# = bool[,] dp = new bool[s.Length, s.Length]; [OK]
- Using jagged array syntax without initializing inner arrays
- Confusing C# array syntax with other languages
- Declaring arrays without proper dimensions
string s = "babad";
string result = LongestPalindrome(s);
Console.WriteLine(result);
string LongestPalindrome(string str) {
int start = 0, maxLength = 1;
int len = str.Length;
bool[,] dp = new bool[len, len];
for (int i = 0; i < len; i++) dp[i, i] = true;
for (int length = 2; length <= len; length++) {
for (int i = 0; i <= len - length; i++) {
int j = i + length - 1;
if (str[i] == str[j]) {
if (length == 2 || dp[i + 1, j - 1]) {
dp[i, j] = true;
if (length > maxLength) {
start = i;
maxLength = length;
}
}
}
}
}
return str.Substring(start, maxLength);
}Solution
Step 1: Understand the input and algorithm
The input string is "babad". The code uses dynamic programming to find the longest palindromic substring by checking substrings of increasing length.Step 2: Trace the longest palindrome found
Both "bab" and "aba" are palindromes of length 3. The code updates start and maxLength when it finds a longer palindrome. It finds "bab" first and returns it.Final Answer:
"bab" -> Option BQuick Check:
Longest palindrome in "babad" = "bab" [OK]
- Assuming "aba" is returned instead of "bab"
- Returning entire string instead of substring
- Ignoring substring length updates
string LongestPalindrome(string s) {
int n = s.Length;
bool[,] dp = new bool[n, n];
int maxLen = 1, start = 0;
for (int i = 0; i < n; i++) dp[i, i] = true;
for (int length = 2; length <= n; length++) {
for (int i = 0; i < n - length; i++) {
int j = i + length - 1;
if (s[i] == s[j]) {
if (length == 2 || dp[i + 1, j - 1]) {
dp[i, j] = true;
if (length > maxLen) {
start = i;
maxLen = length;
}
}
}
}
}
return s.Substring(start, maxLen);
}Solution
Step 1: Analyze the inner loop boundary
The inner loop runs with conditioni < n - length. For substring length 'length', the last valid start index isn - length, but the loop only goes up ton - length - 1, missing it. The loop condition should bei <= n - lengthor equivalentlyi < n - length + 1to include the last substring.Step 2: Identify off-by-one error
This is an off-by-one error in the inner loop condition. Other options are incorrect because the dp array is initialized for single characters, the substring parameters are correct, and length 1 substrings are handled.Final Answer:
The inner loop condition should be < i < n - length + 1 -> Option AQuick Check:
Loop boundary off-by-one = The inner loop condition should be < i < n - length + 1 [OK]
- Ignoring off-by-one errors in loops
- Misunderstanding substring parameters
- Assuming dp initialization is missing
"forgeeksskeegfor", which approach will correctly find the longest palindromic substring and what is the substring?Solution
Step 1: Understand the input string and palindrome
The string "forgeeksskeegfor" contains the palindrome "geeksskeeg" in the middle, which is the longest palindromic substring.Step 2: Identify correct approach and substring
The Expand Around Center approach efficiently finds palindromes by expanding from each center. It will find "geeksskeeg" correctly. The entire string is not a palindrome, so options B, C, and D are incorrect.Final Answer:
Expand Around Center approach; substring is "geeksskeeg" -> Option DQuick Check:
Longest palindrome = "geeksskeeg" via center expansion [OK]
- Assuming entire string is palindrome
- Confusing brute force with efficient methods
- Missing the correct longest substring
Ready to prove it?
Pass the test and this pattern moves unknown
