题目 1200:
回文串
时间限制: 1s 内存限制: 128MB 提交: 4588 解决: 2546
题目描述
回文串是从左到右或者从右到左读起来都一样的字符串,试编程判别一个字符串是否为回文串。
输入格式
输入一个字符串。串长度<255.
输出格式
判别输入的字符串是否为回文串,是输出"Y",否则输出"N"。
样例输入
abcba
样例输出
Y
解法一:直接用reverse将串倒转与原串相比较
#include <iostream>
#include <cstring>
#include <algorithm> // 包含算法库,用于reverse函数
using namespace std;
int main() {
string s;
getline(cin, s); // 从标准输入流(cin)中读取一行字符串,并存储在变量s中
string t = s; // 将字符串s复制给字符串t,用于后续反转操作
reverse(t.begin(), t.end()); // 反转字符串t
if (s == t) { // 如果字符串s和反转后的字符串t相同,则说明字符串是回文
cout << "Y" << endl; // 输出"Y"表示是回文
} else { // 如果字符串s和反转后的字符串t不同,则说明字符串不是回文
cout << "N" << endl; // 输出"N"表示不是回文
}
return 0; // 退出程序
}
解法二:递归解法
#include <iostream> // 包含输入输出流库
#include <cstring> // 包含字符串操作库
using namespace std;
// 定义一个递归函数isPalindrome,用于判断字符串是否是回文
bool isPalindrome(string s, int left, int right) {
if (left >= right) { // 如果左指针不小于右指针,则说明子串中的所有字符已经比较完成
return true; // 返回true表示该子串是回文
}
if (s[left] != s[right]) { // 如果左指针指向的字符与右指针指向的字符不相等,则说明该子串不是回文
return false; // 返回false表示该子串不是回文
}
// 如果左指针指向的字符与右指针指向的字符相等,则递归判断子串是否是回文
return isPalindrome(s, left + 1, right - 1);
}
int main() { // 主函数
string s; // 声明一个字符串s
getline(cin, s); // 从标准输入流(cin)中读取一行字符串,并存储在变量s中
if (isPalindrome(s, 0, s.length() - 1)) { // 调用isPalindrome函数判断字符串是否是回文
cout << "Y" << endl; // 输出"Y"表示是回文
} else {
cout << "N" << endl; // 输出"N"表示不是回文
}
return 0; // 退出程序
}
解法三:双指针
#include <iostream> // 包含输入输出流库
#include <cstring> // 包含字符串操作库
using namespace std;
int main() {
string s; // 声明一个字符串s
getline(cin, s); // 从标准输入流(cin)中读取一行字符串,并存储在变量s中
int left = 0, right = s.length() - 1; // 初始化左右指针,left指向字符串的开头,right指向字符串的结尾
while (left < right) { // 当左指针小于右指针时,执行循环体
if (s[left] != s[right]) { // 如果左指针指向的字符与右指针指向的字符不相等,说明字符串不是回文
cout << "N" << endl; // 输出"N"表示不是回文
return 0; // 退出程序
}
left++; // 左指针向右移动一位
right--; // 右指针向左移动一位
}
cout << "Y" << endl; // 如果循环结束时左指针大于或等于右指针,则说明字符串是回文,输出"Y"
return 0; // 退出程序
}