Tingkat Kesulitan Easy
Kategori String
Pranala Soal Pranala Soal
Pranala Solusi Solusi, Solusi (Python)

Cara menentukan sebuah string palindrom atau bukan

Palindrom adalah salah satu persoalan yang sangat umum di pemrograman. Pengecekan suatu string palindrom atau bukan dapat diperiksa dengan melakukan looping secara simultan dari kiri dan kanan. Berikut adalah contoh implementasinya dalam bahasa C++:

#include <bits/stdc++.h>
using namespace std;

int main() {
  string s;
  cin >> s;

  int n = s.length();
  bool isPalindrome = true;

  // iterasi dari kiri dan kanan secara simultan.
  // pada tiap iterasi, increment indeks di kiri dan decrement indeks di kanan.
  for (int l = 0, r = n-1; l < r; l++, r--) {
    if (s[l] != s[r]) {
      isPalindrome = false;
      break;
    }
  }

  // lakukan sesuatu dengan isPalindrome
}

Solusi Insensitive Palindrome

Kita dapat memodifikasi program di atas untuk soal ini dengan menambahkan satu boolean isSensitive yang menyatakan apakah palindrome saat ini masih case-sensitive atau tidak.

Kita perlu mengubah huruf menjadi case yang sama saat membandingkan insensitive palindrome. Fungsi mengubah case ini ada di sebagian besar bahasa, sebagai contoh tolower dan toupper pada bahasa C/C++. Namun, kita akan mengimplementasikan fungsi tersebut sendiri di bawah.

#include <bits/stdc++.h>
using namespace std;

// Program kita akan tetap benar jika kita menggunakan toLowerCase
char toUpperCase(char c) {
  // Jika c sudah upper-case, maka tidak perlu ubah apa-apa
  if ('A' <= c && c <= 'Z') {
    return c;
  }
  // Jika c bukan upper-case, maka asumsikan c adalah lower-case.
  // Kita dapat mengubah c menjadi upper-case dengan perhitungan sederhana.
  // c - 'a' menyatakan huruf ke berapa c, jika 'a' dihitung 0 dan 'z' dihitung 25.
  // maka, menambahkan nilai ini dengan 'A' akan menghasilkan huruf yang sama tapi dalam case yang berbeda.
  return c - 'a' + 'A';
}

int main() {
  string s;
  cin >> s;

  int n = s.length();
  bool isPalindrome = true;
  bool isSensitive = true;

  // iterasi dari kiri dan kanan secara simultan.
  // pada tiap iterasi, increment indeks di kiri dan decrement indeks di kanan.
  for (int l = 0, r = n-1; l < r; l++, r--) {
    // pertama-tama, bandingkan secara case-insenstive.
    if (toUpperCase(s[l]) != toUpperCase(s[r])) {
      isPalindrome = false;
      isSensitive = false;
      break;
    }
    // kemudian, baru bandingkan secara case-sensitive.
    if (s[l] != s[r]) {
      isSensitive = false;
      break;
    }
  }

  if (isPalindrome && isSensitive) {
    cout << "sensitive palindrome" << endl;
  } else if (isPalindrome) {
    cout << "insensitive palindrome" << endl;
  } else {
    cout << "not a palindrome" << endl;
  }
}

Solusi alternatif: reverse string

Cara alternatif untuk mengecek palindrome atau bukan adalah dengan membandingkan apakah string tersebut masih sama setelah dibalik. Berikut adalah contoh implementasinya dengan menggunakan Python:

s = input()
r = s[::-1] # reverse s

if (s == r):
  print('sensitive palindrome')
elif (s.lower() == r.lower()):
  print('insensitive palindrome')
else:
  print('not a palindrome')