fork download
  1. #include <stdio.h>
  2. #include <stdlib.h> // malloc/free に必要
  3. #include <string.h> // strlen/strcpy/strcat に必要
  4.  
  5. // 文字列 s の長さを返す
  6. int myStrlen(char s[]){
  7. int i;
  8. for(i=0;s[i]!='\0';i++);
  9. return i;
  10. }
  11.  
  12. /**
  13.  * @brief 文字列sを基に、最短の回文を作成して動的に確保したメモリに格納し、そのポインタを返す。
  14.  * @param s 入力文字列
  15.  * @return 作成された最短回文のポインタ
  16.  */
  17. char *setPalindrome(char s[]){
  18. int len = myStrlen(s);
  19. if (len == 0) {
  20. // 空文字列の場合
  21. char *tmp = (char*)malloc(1);
  22. if (tmp) tmp[0] = '\0';
  23. return tmp;
  24. }
  25.  
  26. int i, j;
  27. int suffix_palindrome_start_index = 0; // 最長接尾回文の開始インデックス
  28.  
  29. // 最も長い接尾回文 (suffix palindrome) を探す
  30. // i: 接尾回文の開始インデックス (0 から len-1 まで)
  31. for (i = 0; i < len; i++) {
  32. int is_palindrome = 1;
  33. // i から終端までの部分 s[i...len-1] が回文であるかチェック
  34. for (j = 0; j < (len - i) / 2; j++) {
  35. if (s[i + j] != s[len - 1 - j]) {
  36. is_palindrome = 0;
  37. break;
  38. }
  39. }
  40.  
  41. if (is_palindrome) {
  42. // 接尾回文が見つかった場合、その開始インデックスを記録しループを抜ける
  43. suffix_palindrome_start_index = i;
  44. break;
  45. }
  46. }
  47.  
  48. // 追加すべき文字数 (非回文部分の長さ)
  49. int chars_to_add = suffix_palindrome_start_index;
  50.  
  51. // 必要なメモリサイズ: 元の文字列 (len) + 追加文字 (chars_to_add) + ヌル文字 (1)
  52. char *result = (char*)malloc(len + chars_to_add + 1);
  53. if (result == NULL) {
  54. return NULL;
  55. }
  56.  
  57. // 1. result に元の文字列をコピー
  58. strcpy(result, s);
  59.  
  60. // 2. 非回文部分 (s[0] から s[suffix_palindrome_start_index - 1] まで) を
  61. // 逆順にして result の末尾に追加
  62. int current_result_len = len;
  63.  
  64. for (i = 0; i < chars_to_add; i++) {
  65. // 追加する文字は、非回文部分の末尾から先頭に向かって取得
  66. char char_to_append = s[chars_to_add - 1 - i];
  67.  
  68. // result の末尾に追加
  69. result[current_result_len + i] = char_to_append;
  70. }
  71.  
  72. // 3. 終端文字を設定
  73. result[len + chars_to_add] = '\0';
  74.  
  75. return result;
  76. }
  77.  
  78. // メイン関数はひな形通り
  79. int main(){
  80. int i;
  81. // myStrlen関数がひな形になければ、ここで定義するか、<string.h>をインクルードしstrlenを使用してください。
  82.  
  83. char nyuryoku[1024]; // 入力
  84. char *kaibun; // 回文を受け取る
  85. scanf("%s", nyuryoku);
  86. kaibun = setPalindrome(nyuryoku);
  87. printf("%s -> %s\n", nyuryoku, kaibun);
  88. free(kaibun); // 最後に動的確保したメモリを解放
  89. return 0;
  90. }
Success #stdin #stdout 0.01s 5320KB
stdin
abcd
stdout
abcd -> abcdcba