1、題目描述
1.1、題目
本題要求統計一個字符串中包含多少個迴文子串。首先我們來確定子串的概念:一個字符串的子串,就是指它本身的各個部分。如字符串“aba”的子串有“a”、“b”、“a”、“ab”、“ba”和“aba”。
再來看回文,迴文就是從左讀到右和從右讀到左都是一樣的,長度爲1的字符串也是迴文。如“a”、“s”、"aa"、“aba”和“aabaa”等都是迴文。
本題在一個字符串中,單個字符也被認爲是迴文子串,相同的重複的子串也需要計算在內。本題要求判斷一個字符串中的所有的子串是否是迴文子串。如果用常規方法做,肯定會出現超時錯誤。這裏採用由中心向外擴散的方法去判斷一個子串是否是迴文子串,如果最中心的子串不是迴文,那麼,立即終止,不必去判斷向外圍擴散的子串了,這就大大節約了時間。
下面以“abaa”爲例,講解由中心向外擴散的方法,如下圖所示。
(1)從左往右,釘住最後一個字符。
“abaa”串:先考查中心子串“ba”不是迴文串,就可以判定“abaa”不是迴文子串;
“baa”串:先考查中心子串“baa”不是迴文,它是最外子串,不必向外擴散;
“aa”串:考查中心子串中“aa”是迴文,它是最外子串,不必向外擴散。
(2)從右邊倒數第二個字符往左,釘住第一個字符。
"aba"串:考查中心子串“aba”,是迴文,它是最外子串,不必向外擴展;
“ab”串:考查子串“ab”,不是迴文,它是最外子串,不必向外擴展;
這樣下來,加上單個子串“a”,“b”,“a”,“a”4個,“abaa”中共包含6個迴文子串。
1.2、輸入描述
輸入數據中有多個測試案例。每個案例是一個非空且長度不超過5000的字符串。
處理到文件結尾。
1.3、輸出描述
在每行上打印該字符串中迴文子串的個數。
1.4、輸入樣例
aba
aa
1.5、輸出樣例
4
3
2、C++實現