トップページに戻る
次の競技プログラミングの問題へ
前の競技プログラミングの問題へ
No.273 回文分解
■■■問題■■■
ある文字列Sが与えられる。
文字列Sを文字と文字の間で自由に切って2つ以上の回文に分解する。
このときできる最も文字数の長い回文の文字列の長さを答えよ。
■■■入力■■■
S
文字列Sが与えられる。2 <= 文字列Sの長さ <= 50。
文字列Sの文字はすべて大文字のアルファベットからなる。
■■■出力■■■
分解後の回文のうち最も文字数の長いものの文字数を1行で答えよ。
最後に改行を忘れずに。
C#のソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static string InputPattern = "Input1";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("ABACDDCEFGFE");
//5
//例えば「ABA」と「CDDC」と「EFGFE」の3つの回文に分解できる。
//最も長い回文は「EFGFE」で文字数は5である。
}
else if (InputPattern == "Input2") {
WillReturn.Add("ZZ");
//1
//「ZZ」はすでに回文であるが必ず2つ以上の回文に分解しなければならない。
//1文字の「Z」も回文とみなせるので「Z」と「Z」に分解でき文字数は1である。
}
else if (InputPattern == "Input3") {
WillReturn.Add("AABAAABBABBABBBAAABAA");
//8
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
string S = InputList[0];
//回文判定
Predicate<string> IsKaibun = (pStr) =>
pStr.SequenceEqual(pStr.Reverse());
var KaibunList = new List<string>();
for (int I = 0; I <= S.Length - 1; I++) {
for (int J = S.Length - 1; I <= J; J--) {
string wkStr = S.Substring(I, J - I + 1);
if (IsKaibun(wkStr) == false) continue;
KaibunList.Add(wkStr);
break;
}
}
//分解してない回文をRemove
KaibunList.RemoveAll(X => X == S);
Console.WriteLine(KaibunList.Max(X => X.Length));
}
}
解説
最長の回文以外は、1文字の回文とみなして
ナイーブに最長の回文を探してます。