最短回文串 C語言

2021-10-03 12:31:09 字數 3073 閱讀 4901

給定乙個字串 s,你可以通過在字串前面新增字元將其轉換為回文串。找到並返回可以用這種方式轉換的最短回文串。

示例 1:

輸入: "aacecaaa"

輸出: "aaacecaaa"

示例 2: 

輸入: "abcd"

輸出: "dcbabcd"

要找到最短的新增內容,就相當於從字串位置0開始,查詢到最長的回文串,最長回文串後面的部分稱為有效字尾,我們將有效字尾反轉,新增到原有字串的最前面就可以了

/*

* 需求

給定乙個字串 s,你可以通過在字串前面新增字元將其轉換為回文串。找到並返回可以用這種方式轉換的最短回文串。

示例 1:

輸入: "aacecaaa"

輸出: "aaacecaaa"

示例 2:

輸入: "abcd"

輸出: "dcbabcd"

gcc shortestpalindrome.c -g -o a.exe -ddebug

*/#include #include #include #include #include #ifdef debug

#define log(fmt, args...) fprintf(stdout, fmt, ##args)

#define breaker(a, b, c) breaker(a, b, c)

#else

#define log(fmt,...)

#define breaker(a, b, c)

#endif

#define true 1

#define false 0

#define max(a, b) ((a) > (b) ? (a) : (b))

#define min(a, b) ((a) > (b) ? (b) : (a))

bool ispalindromestr(char * head, char * tail)

head++;

tail--;

} return ret;

}int longestpalindromesubstrfromhead(char * s, char ** pdrear)

do rear--;

} while(rear != s);

*pdrear = rear;

pdlen = rear - s + 1;

return pdlen;

}char * shortestpalindrome(char * s)

char * rear = null, * pdrear = null;

char * substr = null, *p = null;

int pdlen = 0, len = 0, total = 0;

len = strlen(s);

if(0 == len)

rear = s + len - 1;

pdlen = longestpalindromesubstrfromhead(s, &pdrear);

total = len - pdlen + len + 1; /*字尾長度 + 原有字串長度 + '\0' */

最短回文串

給定乙個字串 s,你可以通過在字串前面新增字元將其轉換為回文串。找到並返回可以用這種方式轉換的最短回文串。示例 1 輸入 aacecaaa 輸出 aaacecaaa 示例 2 輸入 abcd 輸出 dcbabcd 解法1思路 因為是在前面加乙個最少的資料,我們先想最笨的辦法,就是在abcd前面加上a...

最短回文串 題解

最短回文串 palindrome.pas c cpp 如果乙個字串正過來讀和倒過來讀是一樣的,那麼這個字串就被稱作回文串。例如abcdcba,abcddbca就是回文串,而abcdabcd不是。你要解決的問題是 對於任意乙個字串,輸出將這個字串變為回文串需要插入的最少字元個數,比如,ab3bd只需要...

作業 最短回文串

最短回文串 palindrome.pas c cpp 如果乙個字串正過來讀和倒過來讀是一樣的,那麼這個字串就被稱作回文串。例如 abcdcba,abcddbca 就是回文串,而 abcdabcd 不是。你要解決的問題是 對於任意乙個字串,輸出將這個字串變為回文串需要插入的最 少字元個數,比如,ab3...