紫薯P48 例题3-3

一、题意

输入一些字符串,要求分别对每个字符串判断:是不是回文串;是不是镜像串。并输出相应的答句。

二、解析

回文串判断:reverse后是否相等
镜像串判断:reverse+映射每个字符到其镜像字符后,是否和原串相等

三、代码

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
const string characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789";
const string reverses   = "A   3  HIL JM O   2TUVWXY51SE Z  8 ";
const string ans[4] = {"is not a palindrome.", "is a regular palindrome.",
                       "is a mirrored string.", "is a mirrored palindrome."};
                       // idx = 2 * x + y. x表示是否是镜像, y表示是否是回文

int main() {
    string str;
    while(cin >> str) {
        bool x = 0, y = 0;
        string rev = str;
        reverse(rev.begin(), rev.end());
        y = str == rev;

        string mir;
        for(auto ch : rev) {
            int idx = characters.find(ch);
            mir.push_back(reverses[idx]);
        }
        x = str == mir;

        cout << str << " -- " << ans[2 * x + y] << "\n" << endl;
    }
}

四、归纳

  • 在时间复杂度允许下,学会用两个const串表示映射关系,而不一定要用map或其它函数
  • 有同学可能会说,遍历一半就可以判断了,然而遍历一半并不会在数量级上减少时间复杂度,因此应该怎么方便怎么来就好啦

看了一下我第一次做时写的代码...真认真啊orz