namespace PalindromeTest {
public interface IStringUtilities {
String GetSubstring(String s, int start, int end);
public class Utilities : IStringUtilities {
public String GetSubstring(String s, int start, int end){
int length = (end - start) + 1;
return s.Substring(start, (s.Length -1));
return s.Substring(start, length);
public abstract class StringExtensions : IStringUtilities {
private readonly IStringUtilities _u;
public StringExtensions(IStringUtilities u){
public String GetSubstring(String s, int start, int end){
return _u.GetSubstring(s, start, end);
public class Palindrome : StringExtensions {
public String longest_palindrome;
public int palindrome_length;
public Palindrome(String val) : base(new Utilities())
this.length = val.Length;
this.table = new bool[this.length, this.length];
this.longest_palindrome = "";
this.palindrome_length = this.longest_palindrome.Length;
public void CheckAndSetPalidromeLevel1(int i){
if( GetSubstring(chars, i, i).Length > palindrome_length ){
longest_palindrome = GetSubstring(chars, i, i);
public void CheckAndSetPalindromeLevel2(int i){
if(chars[i] == chars[i + 1]){
if(GetSubstring(chars, i, (i + 1)).Length > length ){
longest_palindrome = GetSubstring(chars, i, (i + 1));
public void CheckAndSetPalindromeGreaterThan2(int k, int i){
Console.WriteLine("----- test ----- \n [i, j]: [{0}, {1}], \n palindromString[i]: {2}, \n palindromString[j]: {3}, \n String : {4} \n Table : {5}", i, j, chars[i], chars[j], GetSubstring(chars, i, j), table[(i + 1),(j - 1)]);
if(chars[i] == chars[j] && table[(i + 1),(j - 1)] == true){
if(GetSubstring(chars, i, j).Length > palindrome_length){
Console.WriteLine("---- NEW LONGER ----{0}", GetSubstring(chars, i, j));
longest_palindrome = GetSubstring(chars, i, j);
public static void Main()
Palindrome palindrome = new Palindrome("abaxabaxabb");
for(int i = 0; i < palindrome.length; i++){
for(int k = 0; k < palindrome.length; k++){
palindrome.table[i,k] = false;
Console.WriteLine("----- 1");
for(int i = 0; i < palindrome.length; i++)
Console.WriteLine("value: {0}, k: [{1}, {1}]", palindrome.table[i, i], i);
palindrome.CheckAndSetPalidromeLevel1(i);
Console.WriteLine("----- 2");
for(int i = 0; i < palindrome.length - 1; i++){
Console.WriteLine("value: {0}, k: [{1}, {2}]", palindrome.table[i, (i + 1)], i, (i + 1));
palindrome.CheckAndSetPalindromeLevel2(i);
Console.WriteLine("----- > 2");
for(int k = 2; k < palindrome.length - 2; k++){
for(int i = 0; i < palindrome.length - 2; i++){
palindrome.CheckAndSetPalindromeGreaterThan2(k, i);
Console.WriteLine("==================== \n ");
Console.WriteLine("Longest Palindrome is : {0}", palindrome.longest_palindrome);