Привет Вот мой код, чтобы найти самый длинный палиндром в строке. Пожалуйста, обратитесь к следующей ссылке, чтобы понять алгоритм http://stevekrenzel.com/articles/longest-palnidrome
Используемые тестовые данные: HYTBCABADEFGHABCDEDCBAGHTFYW12345678987654321ZWETYGDE
//Function GetPalindromeString
public static string GetPalindromeString(string theInputString)
{
int j = 0;
int k = 0;
string aPalindrome = string.Empty;
string aLongestPalindrome = string.Empty ;
for (int i = 1; i < theInputString.Length; i++)
{
k = i + 1;
j = i - 1;
while (j >= 0 && k < theInputString.Length)
{
if (theInputString[j] != theInputString[k])
{
break;
}
else
{
j--;
k++;
}
aPalindrome = theInputString.Substring(j + 1, k - j - 1);
if (aPalindrome.Length > aLongestPalindrome.Length)
{
aLongestPalindrome = aPalindrome;
}
}
}
return aLongestPalindrome;
}
Разработка классов (или платформы), чтобы быть расширяемой не тривиальна, и помещенная, просто наследование не является единственным принципом Объектно-ориентированного программирования.
Так sealed
существует, чтобы позволить разработчику / разработчик выражать и сохранять те намерения. Изоляция класса может также сделать их жизнь легче путем сокращения нагрузки обслуживания. Это позволяет исходному разработчику управлять, как класс (или платформа) расширяется, таким образом, они могут внести внутренние изменения, не волнуясь о повреждении изменений в коде других.
Один принцип - то, что разработчики должны изолировать любой лист классы по умолчанию. Затем когда разработчик создает негерметизированный класс намеренно, он вынуждает их думать о расширяемости.
<час>Касательно: Eric Lippert - , Почему Изолированы Столь многие Классы Платформы?
Этот ответ от несколько связанного вопроса, который я задал сегодня, мог бы помочь разъяснить цели изолировать класс:
я задавал тот же самый вопрос, пока я не начал работать над допускающими повторное использование моими собственными библиотеками. Много раз Вы волнуете с определенными классами, которые просто не могут быть расширены, не требуя неясных или тайных последовательностей вызовов от конструктора.
, позволяя Вашему классу быть расширенными, необходимо спросить: если разработчик расширяет мой класс и передает этот новый класс моей библиотеке, я могу прозрачно работать с этим новым классом? Я могу работать правильно с этим новым классом? Этот новый класс действительно собирается вести себя то же?
я нашел, что большую часть времени запечатанные классы в.Net Framework имеют определенные требования под капотом, чтобы Вы не знали, и который, учитывая текущую реализацию не может быть безопасно выставлен подклассам.
Теперь переходят по той ссылке и upvote фактический автор.
Короткий ответ, потому что Microsoft заявила так. Более длинный ответ - то, что Microsoft обеспечила механизм для расширения запечатанных классов, методов вызываемого внутреннего абонента.
В целом, это - плохая идея расширить классы который, к которому у Вас нет исходного кода. Например, Вы не знаете то, что вызов базового метода делает к внутренним данным объекта. Да, можно использовать отражатель или безотносительно понимать это, но в целом намного лучше использовать состав или дополнительные методы.
также необходимо рассмотреть, каково наследование на самом деле. Это не просто способ изменить класс, это также обеспечивает полиморфизм. Что при изменении семантики, скажем, строкового класса, затем Вы передаете свой новый строковый класс объекту, который ожидает, что строка будет действовать в особенном методе? изолированный по существу осуществляет контракт, что этот объект будет всегда работать способ, к которому Вы ожидаете это.
Не роя слишком глубоко, поймите, что польза Microsoft, изолирующая класс, когда существует потенциальная безопасность, пригодность для обслуживания или назад-проблемы-совместимости, что это должно будет иметь дело с нисходящим потоком. Например, System.String
изолируется по причинам производительности и безопасности.
В данном случае, необходимо было бы спросить разработчика Microsoft, почему они приняли решение изолировать тот класс. Однако архитектурная литература руководства, которую я читал в последнее время, имеет тенденцию способствовать подходу "изоляции, если Вы не будете знать , это должно будет быть расширено". Эта литература имеет тенденцию поддерживать использующие дополнительные методы, если это возможно. (Я не говорю, что соглашаюсь с ним; я просто говорю, что это - то, что я читал в последнее время.)
, Даже если бы класс не был изолирован, рассматриваемые свойства, возможно, оставили не виртуальными, который все еще оставил бы Вас ручьем здесь.
В Вашем определенном сценарии, я пошел бы с дополнительными методами с Вашими собственными уникальными именами. Это обо всем, что можно сделать.
В то время как я действительно соглашаюсь, что.NET, вероятно, изолирует слишком много, она должна обычно защищать целостность экосистемы. Когда один из Ваших высших приоритетов должен сохранить стабильность Вашей полной платформы/API/времени выполнения, и существуют несколько хрупкие взаимозависимости между классами, может быть самым безопасным препятствовать тому, чтобы люди переопределили то поведение и непреднамеренно дестабилизировали базовую функциональность.
, Хотя снова, я действительно склонен чувствовать, что команда.NET изолирует слишком много классов. Изоляция может иногда быть простой ленью со стороны разработчика, потому что надлежащий дизайн класса был бы слишком большой работой.
Я предположил бы, что нет никакого серьезного основания для изоляции классов кроме защитить неосведомленное - допускают ошибку, я имею в виду невинный. Вы знаете старую поговорку, "данный их достаточно веревки и они подвесят себя". Позвольте им колебаться, я говорю. Возможно, это - мое образование C++, но я - довольно удобное знание, что я имею право полностью наполнять вещи, если я не прилежен.
я склонен программировать интерфейсом. Интерфейсы являются, конечно, открытыми, и любой свободен обеспечить их собственную реализацию, которая придерживается контракта, выраженного интерфейсом. Мои реальные классы, которые реализуют эти интерфейсы, имеют тенденцию быть частной фирмой и отмечены внутренние и/или частные. Я не чувствую, что должен изолировать такие классы.
, Где повторное использование кода желательно, я избегаю повторного использования посредством наследования, одобряя состав и другие методы.
Изоляция может также быть допустимой на типах, которые считают типами простых данных, но я не убежден, иссушают путь на этом.
Это зависит, существуют классы, которые предназначаются, чтобы быть просто инстанцированными (наследование, если существует, используется только для упрощения реализации), другие классы предназначаются, чтобы быть наследованными для обеспечения определенной реализации.
Запечатанные классы имеют некоторые преимущества:
Иначе, если Вы хотите украсить запечатанный класс методами "комфорта", используют дополнительные методы (C# 3.0).
Просто, потому что что-то - объект, это не означает, что это всегда должно быть широко открытым для всех для расширения, или переопределять это - поведение.
А хорошая аналогия была бы дверью и блокировкой. Характер двери состоит в том, чтобы позволить людям для прохождения через него, это - то, для чего это создается. Все же большинство дверей разработано с блокировками, которые могут ограничить способность людей пройти через них. Решение, имеет ли дверь блокировку и заблокирована ли та блокировка по умолчанию, оставлено архитектору комнаты, на основе того, что находится в комнате и у кого должен быть доступ к нему, не на том, что это - дверь.
, Конечно, может быть печально, если большинство дверей, в особенности создающих, заблокировано по умолчанию, особенно если существует тот, который Вы действительно хотите пройти.:-) Я был там мной, и я задал тот же вопрос. Короткий ответ - то, что иногда при разработке сложной платформы, люди склонны допускать ошибку немного на более осторожной стороне и изолировать классы по умолчанию, если нет явный сценарий, который требует, чтобы они были расширены.