[牛課習題]判斷字符串是否迴文及統計迴文

題目描述

“迴文串”是一個正讀和反讀都一樣的字符串,比如“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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章