題目描述
“迴文串”是一個正讀和反讀都一樣的字符串,比如“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
題目分析:
- 首先我們要搞清楚什麼是迴文串,迴文串就是從左邊和右邊同時看讀出的數據是相同的,比如noon和level。level這類字符比較特殊,按照代碼思路要注意看需不需要特殊處理
- 判斷迴文很簡單,定義兩個位置,start和end去遍歷字符串,從str的start和end各取一個字符,如果不相等直接返回false,說明他不是迴文串,相等則start++,end--進行下一位置的判斷,循環結束條件就是start <= end,等於的情況就相當於上面level中的v字符。
- 統計構成迴文串的方法數,這裏我直接使用的是暴力破解,定義一個臨時字符串保存str1的值,把str2插入到tmp的各個位置進行判斷,如果是迴文串,count++,最後輸出count數就行了。這裏需要注意的是插入的位置,從0 <= i <= str1.size() 都是可以的,一定要注意取等號時的str1.size(),不然可能無法通過測試用例。
代碼如下:
#include <iostream>
#include <string>
using namespace std;
bool isCircle(string str)
{
size_t start = 0;
size_t end = str.size()-1;
while(start <= end)
{
if(str[start] != str[end])
return false;
start++;
end--;
}
return true;
}
int main()
{
string str1, str2;
int count = 0;
while(cin >> str1 >> str2)
{
int sz = str1.size();
for(size_t i = 0; i <= sz; ++i)
{
string tmp = str1;
tmp.insert(i, str2);
if(isCircle(tmp))
count++;
}
cout << count << endl;
}
return 0;
}