我之甘冒世不韙,竭全力以爭取,非特求免兇殘之苦,
實求善良之安頓,求人格之確立,求靈魂之救度耳。
我將茫茫人海中,放我唯一靈魂之伴侶。得之,我幸;不得,我命。——徐志摩
題目描述
統計迴文 | 時間限制:1秒 | 內存限制:32768K
“迴文串”是一個正讀和反讀都一樣的字符串,比如“level”或者“noon”等等就是迴文串。花花非常喜歡這種擁有 對稱美的迴文串,生日的時候她得到兩個禮物分別是字符串A和字符串B。現在她非常好奇有沒有辦法將字符 串B插入字符串A使產生的字符串是一個迴文串。你接受花花的請求,幫助她尋找有多少種插入辦法可以使新 串是一個迴文串。如果字符串B插入的位置不同就考慮爲不一樣的辦法。
例如:
A = “aba”,B = “b”。這裏有4種把B插入A的辦法:
- 在A的第一個字母之前: “baba” 不是迴文
- 在第一個字母‘a’之後: “abba” 是迴文
- 在字母‘b’之後: “abba” 是迴文
- 在第二個字母’a’之後 “abab” 不是迴文
所以滿足條件的答案爲2
輸入描述: 每組輸入數據共兩行。 第一行爲字符串A 第二行爲字符串B 字符串長度均小於100且只包含小寫字母 輸出描述: 輸出一個數字,表示把字符串B插入字符串A之後構成一個迴文串的方法數
示例1: 輸入 aba b 輸出 2
題目解析
迴文串也就是前後對稱的字符串。本題是判斷是否是迴文串的變形題。字符串本身不一定是迴文,把第二個字符串插入進去看是否是迴文。
解題思路
本題使用暴力求解方式計算即可,遍歷str1,將str2 insert進入str1的每個位置,判斷是否是迴文,是就 ++count;需要注意的是這裏不能 str1.insert(i, str2),這樣的話str1改變了,判斷下一個位置就不對了。所 以每次使用str1拷貝構造一個str,然後str.insert(i, str2),再判斷。
#include<iostream>
#include<string>
using namespace std;
// 判斷是否是迴文
bool IsCircleText(const string& s) {
size_t begin = 0;
size_t end = s.size()-1;
while(begin < end){
if(s[begin] != s[end]){
return false;
}
++begin;
--end;
}
return true; }
int main() {
std::string str1, str2;
getline(cin, str1);
getline(cin, str2);
size_t count = 0;
for(size_t i = 0; i <= str1.size(); ++i){
// 將字符串2插入到字符串1的每個位置,再判斷是否是迴文
string str = str1;
str.insert(i, str2);
if(IsCircleText(str)){
++count;
}
}
cout<<count<<endl;
return 0;
}