2022.11.30 PM 07:00 by CBJ
來源 : https://zerojudge.tw/ShowProblem?problemid=a022 出題者 : jiangsir 標籤 : 字串處理(reverse)、for(i,j)迴圈、stack(堆疊) 難易度 : 2
解題想法 : 本題有三種解法(如標籤),因此分別使用了C,C++,Python三種語言實作不同的方式,參考如下 : 1. C - for(i,j)迴圈 設定兩個變數i,j, i從0出發往右走,j從(輸入字串長度 - 1)出發往左走,直到 i>=j 為止,過程判斷輸入字串的第i項是否等於第j項,若不是則可直接輸出"no"並結束程式,若迴圈正常結束則必為回文,直接輸出"yes"即可。 (示意圖) abcba abcba ^ ^ ==(i++,j--)=> ^ ^ ==(i++,j--)=> yes i j i j abca abca ^ ^ ==(i++,j--)=> ^^ ==(b != c)=> no i j ij 2. C++ - stack(堆疊) 首先將輸入字串分為前半和後半(皆不含中間),並將前半先丟進stack,再來跑一個for i走訪後半,若stack最上方的元素不是字串的第i項的話,則直接輸出no並結束程式,反之則將stack的頂端元素pop掉,若迴圈正常結束則表示成功,輸出yes。 至於前半後半的判斷,需使用數學方式來實作,例如設字串長為a,若a為奇數,則 a/2 = 中間項,因此後半會從 a/2+1 開始;若a為偶數,則a/2就是後半的開頭。根據上述說明可以發現到,後半的開頭可以由以下方法求得 : is_odd = s.size()%2 (奇數為1,偶數為0) 後半的開頭 = s.size()/2 + is_odd,符合規則。 3. Python - reverse 取得迭代器翻轉後的結果,可以使用[::-1]來實現,詳細可參考此連結(https://reurl.cc/YdqbK4),如此一來我們只需要再多一個字串存翻轉後的結果,若翻轉後的結果和原字串相等,則輸出yes,反之輸出no。
//C language
#include<stdio.h>
#include<string.h>
char str[1005];
int main(){
fgets(str,1005,stdin);
for(int i=0,j=strlen(str)-1; i<j; i++,j--){
if(str[i]!=str[j]){
printf("no\n");
return 0;
}
}
printf("yes\n");
return 0;
}

//C++ language
#include<iostream>
#include<string>
#include<stack>
using namespace std;
int main(){
string s;
cin>>s;
stack<char>st;
for(int i=0;i<s.size()/2;i++){
st.push(s[i]);
}
int is_odd = (s.size()%2);
for(int i=s.size()/2+is_odd; i<s.size();i++){
if(st.top()!=s[i]){
cout<<"no\n";
return 0;
}
st.pop();
}
cout<<"yes\n";
return 0;
}

## Python language
s=input()
t=s[::-1]
if s==t: print("yes")
else: print("no")
