UVA401回文串 映象串判斷

2021-10-07 16:48:54 字數 1107 閱讀 4382

回文串的判斷不難,難點在於映象串的判斷,所謂映象串就是根據題目的映象表兩次映象後保持原樣就是映象串,第一次映象後得到的是這個串的倒像,所以判斷乙個映象串的依據就是一次翻轉後是這個串的倒像。

問題在於怎麼映象,寫個函式整個串映象?還是寫個函式只映象單個字元?顯然如果我們映象整個串會麻煩很多,所以選擇映象單個字元。隨之而來的問題是我們怎麼存題目給的映象表,我一開始的想法是用兩個string分別存原字元和映象字元,然後每次映象時先找到該字元位置,然後找這個位置對應的映象字元。後來看到題解就驚了,怎麼就這麼點**。

看完才明白自己想複雜了,這個映象表是有規律的,從a ~ z26個字母 +1 ~ 9( 9個數字),但凡是有規律的東西都能夠做簡化,我之前想要用兩個string,但存原字元的那個string可以省略,然後我們也不需要查詢字元再找映象,因為映象表是有規律的。具體做法看**理解。

#include

using

namespace std;

string s =

"a 3 hil jm o 2tuvwxy51se z 8 "

;string res=

;int

mir(

char a)

intmain()

cout << a <<

" -- "

<< res[t1 +

2* t2]

<< endl;

cout << endl;

}return0;

}

這是根據書上的例子稍作修改的**,我覺得很巧妙的乙個地方在最後輸出的結果上,如果是一般人,都會在最後寫上4個if判斷,不同情況輸出,而書的作者直接先把四個結果存起來,我們知道兩位二進位制可以得到4種不同的結果0,1,2,3,正好我們的輸出結果也就是四種,所以就將t1,t2作為二進位制位得到乙個數t1+2t2(這裡也可以t2+2t1,但res陣列存的字串順序也要隨之改變),用這個數作為下標來訪問存放結果的陣列,輸出字串。

這個方法保證了每組t1,t2都有乙個唯一對應的結果t1+2*t2,而且不同的t1,t2一定有不同的輸出結果。

只用少量的**就能解決乙個看似複雜的問題,這就是大犇吧。

例題3 3 回文詞 UVa 401

palindromes uva 401 這道題目可使用兩個常量陣列,並且用了兩個偽指標,回文詞判斷就是兩邊指標往內收縮,全部相同就是回文詞 如果是長度為奇數最中間的字元不需考慮 映象詞同樣也是兩邊指標往內收縮,但是要判斷是不是為互相的映象字元 注意 長度為奇數的話最中間的字元需要判斷是否為自己的映象...

例題3 3 回文詞(UVa401)

輸入乙個字串,判斷它是否為回文串以及映象串。輸入字串保證不含數字0.所謂回文串,就是反轉以後和原串相同,如abba和madam。所有映象串,就是左右映象之後和原串相同,如2s和3aiae。注意,並不是每個字元在映象之後都能得到乙個合法字元。在本題中,每個字元的映象如圖所示 空白項表示該字元映象後不能...

回文串uva401(清簡出風塵)

大神之所以是大神,是因為其在任何一次回答前都有著思考 include include include using namespace std const char rev a 3 hil jm o 2tuvwxy51se z 8 注意指標符號與陣列的關係 const char msg 巧妙地利用p,...