C++ で大きな回文を見つけるプログラムを作成しています。大文字と小文字、句読点、および空白を無視して、入力された文字列の回文を取得する必要があります。たとえば、次の行を参照してください。
Confusius say: マダム、私はアダムです。
ここで、最大の回文はマダムです。大文字と小文字、句読点、空白を無視すると、私はアダムです。
また、プログラムは、2000 文字の文字列を 1 秒未満でテストできるように効率的でなければなりません。したがって、最大の回文を返すための次のコードがあります。
string largestPal(string input_str) {
string isPal = "";
string largest = "";
int j, k;
for(int i = 0; i < (input_str.length() - 1); ++i) {
k = i + 1;
j = i - 1;
if(j >= 0 && k < (input_str.length())) {
if(input_str[i] == input_str[j])
j--;
else if(input_str[i] == input_str[j])
k++;
}
while(j >= 0 && k < (input_str.length())) {
if(input_str[j] != input_str[k])
break;
else {
j--;
k++;
}
isPal = input_str.substr(j + 1, k - j - 1);
if(isPal.length() > largest.length()) {
largest = isPal;
}
}
}
return largest;
}
そして、このメソッドのパラメーターとして完全にフォーマットされた文字列 (空白、句読点、大文字と小文字を区別しない) を入力してみましたが、必要な出力を得ることができました。(たとえば、前の例では、最大の回文としてMADAMIMADAMが返されます。
質問:
この文字列を元の状態に戻すにはどうすればよいですか (句読点、空白、大文字と小文字を使用)。
また
メソッド内でストリップされた文字列を直接テストする方法はありますlargestPal
が、選択した最大の回文に対応する元の文字列 (ストリップされていない) を返すにはどうすればよいですか?
どんな助けでも大歓迎です!