Следующий код вычисляет Palidrom для строк длины и нечетной длины.
Не лучшее решение, но работает для обоих случаев
HYTBCABADEFGHABCDEDCBAGHTFYW12345678987654321ZWETYGDE HYTBCABADEFGHABCDEDCBAGHTFYW1234567887654321ZWETYGDE
private static String getLongestPalindrome(String string) {
String odd = getLongestPalindromeOdd(string);
String even = getLongestPalindromeEven(string);
return (odd.length() > even.length() ? odd : even);
}
public static String getLongestPalindromeOdd(final String input) {
int rightIndex = 0, leftIndex = 0;
String currentPalindrome = "", longestPalindrome = "";
for (int centerIndex = 1; centerIndex < input.length() - 1; centerIndex++) {
leftIndex = centerIndex;
rightIndex = centerIndex + 1;
while (leftIndex >= 0 && rightIndex < input.length()) {
if (input.charAt(leftIndex) != input.charAt(rightIndex)) {
break;
}
currentPalindrome = input.substring(leftIndex, rightIndex + 1);
longestPalindrome = currentPalindrome.length() > longestPalindrome
.length() ? currentPalindrome : longestPalindrome;
leftIndex--;
rightIndex++;
}
}
return longestPalindrome;
}
public static String getLongestPalindromeEven(final String input) {
int rightIndex = 0, leftIndex = 0;
String currentPalindrome = "", longestPalindrome = "";
for (int centerIndex = 1; centerIndex < input.length() - 1; centerIndex++) {
leftIndex = centerIndex - 1;
rightIndex = centerIndex + 1;
while (leftIndex >= 0 && rightIndex < input.length()) {
if (input.charAt(leftIndex) != input.charAt(rightIndex)) {
break;
}
currentPalindrome = input.substring(leftIndex, rightIndex + 1);
longestPalindrome = currentPalindrome.length() > longestPalindrome
.length() ? currentPalindrome : longestPalindrome;
leftIndex--;
rightIndex++;
}
}
return longestPalindrome;
}
Существует реализация TGetOpt, утверждающая, что
реализует вариант getopt для Delphi. Он почти совместим с POSIX, поддерживает длинные параметры, обязательные, необязательные и без аргументов
Вы можете найти его здесь .
Файл getopts.pp FPC RTL представляет собой автономный модуль, совместимый с Delphi (включая Delphi2009), который реализует getopt:
Реализация Getopt для Free Pascal, смоделирован на основе GNU getopt
Что не так с FindCmdLineSwitch в модуле SysUtils?
if FindCmdLineSwitch('h',['-'],false) then
Print_Help();
if FindCmdLineSwitch('v',['-'],false) then
print_Version();
вам придется перебирать параметры, чтобы получить значения, но это довольно просто сделать:
if FindCmdLineSwitch('f',['-'],false) then
for ix := 1 to paramcount do
if (paramStr(ix) = '-f') and (ix < paramcount) then
begin
if fileExists( ParamStr(ix+1) ) then
filename := ParamStr(ix+1);
break;
end
Там есть «Парсер командной строки Gastown Delphi», исходный код которого недавно был открыт (например, на Torry's ). Я никогда им не пользовался, поэтому не могу его комментировать.
Ничего встроенного - кроме вас сделать его довольно легко. Это должно быть близко к тому, к чему вы привыкли
TsoCommandLineParser = class
private
fArguments:TStringList;
public
constructor Create();
destructor Destroy(); override;
function GetOpt(const pArgument:string; const pDefaultValue:string = ''):string;
end;
constructor TsoCommandLineParser.Create();
var
i:Integer;
begin
inherited Create();
fArguments := TStringList.Create();
for i := 1 to ParamCount() do
begin
fArguments.Add(ParamStr(i));
end;
end;
destructor TsoCommandLineParser.Destroy();
begin
fArguments.Free();
inherited Destroy();
end;
function TsoCommandLineParser.GetOpt(const pArgument:string; const pDefaultValue:string = ''):string;
var
i:Integer;
begin
i := fArguments.IndexOfName(pArgument);
if i > -1 then
begin
Result := fArguments.ValueFromIndex[i];
end
else
begin
Result := pDefaultValue;
end;
end;