#include <stdio.h>
#include <stdlib.h> // malloc/free に必要
#include <string.h> // strlen/strcpy/strcat に必要
// 文字列 s の長さを返す
int myStrlen(char s[]){
int i;
for(i=0;s[i]!='\0';i++);
return i;
}
/**
* @brief 文字列sを基に、最短の回文を作成して動的に確保したメモリに格納し、そのポインタを返す。
* @param s 入力文字列
* @return 作成された最短回文のポインタ
*/
char *setPalindrome(char s[]){
int len = myStrlen(s);
if (len == 0) {
// 空文字列の場合
if (tmp) tmp[0] = '\0';
return tmp;
}
int i, j;
int suffix_palindrome_start_index = 0; // 最長接尾回文の開始インデックス
// 最も長い接尾回文 (suffix palindrome) を探す
// i: 接尾回文の開始インデックス (0 から len-1 まで)
for (i = 0; i < len; i++) {
int is_palindrome = 1;
// i から終端までの部分 s[i...len-1] が回文であるかチェック
for (j = 0; j < (len - i) / 2; j++) {
if (s[i + j] != s[len - 1 - j]) {
is_palindrome = 0;
break;
}
}
if (is_palindrome) {
// 接尾回文が見つかった場合、その開始インデックスを記録しループを抜ける
suffix_palindrome_start_index = i;
break;
}
}
// 追加すべき文字数 (非回文部分の長さ)
int chars_to_add = suffix_palindrome_start_index;
// 必要なメモリサイズ: 元の文字列 (len) + 追加文字 (chars_to_add) + ヌル文字 (1)
char *result
= (char*)malloc(len
+ chars_to_add
+ 1); if (result == NULL) {
return NULL;
}
// 1. result に元の文字列をコピー
// 2. 非回文部分 (s[0] から s[suffix_palindrome_start_index - 1] まで) を
// 逆順にして result の末尾に追加
int current_result_len = len;
for (i = 0; i < chars_to_add; i++) {
// 追加する文字は、非回文部分の末尾から先頭に向かって取得
char char_to_append = s[chars_to_add - 1 - i];
// result の末尾に追加
result[current_result_len + i] = char_to_append;
}
// 3. 終端文字を設定
result[len + chars_to_add] = '\0';
return result;
}
// メイン関数はひな形通り
int main(){
int i;
// myStrlen関数がひな形になければ、ここで定義するか、<string.h>をインクルードしstrlenを使用してください。
char nyuryoku[1024]; // 入力
char *kaibun; // 回文を受け取る
kaibun = setPalindrome(nyuryoku);
printf("%s -> %s\n", nyuryoku
, kaibun
); free(kaibun
); // 最後に動的確保したメモリを解放 return 0;
}