題目詳情
這是個字串問題。我們的字串只包含大寫字母。我們定義乙個字母和它13位以後的字母互補。即a與n互補,b與o互補,c與p互補……,我們需要找乙個字串的兩個不重疊的子串,其中乙個和另外乙個的翻轉全互補。另外,因為我們的問題來自生物學,所以我們允許這兩個字串的乙個可以刪掉兩個字元(注意:僅允許乙個字串刪掉任意位置的兩個字元,另外乙個必須全部互補上)。我們的目的是求最長的反向互補子串的長度。
輸入格式:
多組資料,每組資料一行,有乙個字串。每個字串長度不超過2000,只有大寫英文本母組成。
輸出格式:
每組資料輸出一行包含乙個整數,表示最長的反向互補子串長度。
答題說明
輸入樣例
abcd
abcdqopn
abon
輸出樣例:02
2解釋:
第乙個樣例,沒有互補的子串。
第二個樣例,ab和no互補,所以反向互補子串的時候我們可以選擇npo,刪掉乙個p即可。
第三個樣例,ab與on反向互補。
題目分析,該題是dp問題,剛剛接觸該問題時,找不到解題點,故而給出了下面的解答,解題錯誤,但是至今還是沒有找到錯在**,錯誤的演算法如下:
//反向互補子串
#include #include //返回從當前引數i開始的字串中反向互補子串的長度
//len是字串str的長度
int complementary(const int i,const char *str,const int len);
//判斷str[i],str[j]是否互補
//互補返回1,否則返回0
int equal(const char *str,int i,int j);
int main()
int equal(const char *str,int i,int j)
利用dp求解,需要找到最優子結構,
子串行 子串
def foo num list 求陣列中最大子串行的和,子串行必須連續 length len num list max value 10000000000 tmp 0 for i in range length tmp max tmp num list i num list i max value...
子串行 子串
1 第一種思路模板是乙個一維的 dp 陣列 int n array.length int dp newint n for int i 1 i n i 例如 最長遞增子串行 在這個思路中 dp 陣列的定義是 在子陣列 array 0 i 中,我們要求的子串行 最長遞增子串行 的長度是 dp i 2 第...
把字串反向排列
pointers on c 這本書上的乙個練習題。編寫函式reverse string,它的原型如下 void reverse string char string void reverse string char string char last char for last char string...