1. 程式人生 > 其它 >如何用回溯演算法解決分割問題

如何用回溯演算法解決分割問題

我們以力扣 131.分隔迴文串問題為例

首先我們要了解分隔問題和組合問題的不同 首先分割問題是得到相互連續的字串

而組合問題中各個元素之間是不連續的

因此 我們可以修改對startindex的理解 來完成

例如 組合問題startindex是為了防止重複遍歷同時也起到了搜尋開始點的作用

而分割問題start 則與 j一同構成分割子串的區間 有startindex 則說明分割成功

下面看程式碼

char** path; int pathTop; char*** ans; int ansTop = 0; int* ansSize;
//將path中的字串全部複製到ans中 void copy() { //建立一個臨時tempPath儲存path中的字串 char **temp =(char**) maloc (sizeof)(char*) * pathTop); for(int i-0 ; i< pathTop ; i++) { temp[i] = path [i]; }
//儲存temp ans[ansTop] = temp; //將當前path的長度(pathTop)儲存在ansSize中 ansSize[ansTop++] = pathTop; }
//判斷字串是否為迴文字串 bool isPalindrome(char* str, int startIndex, int endIndex) { //雙指標法:當endIndex(右指標)的值比startIndex(左指標)大時進行遍歷 while(endIndex >= startIndex) { //若左指標和右指標指向元素不一樣,返回False if(str[endIndex--] != str[startIndex++]) return 0; } return 1; }
//切割從startIndex到endIndex子字串 char* cutString(char* str, int startIndex, int endIndex) { //開闢字串的空間 char * tempstring = char(*) malloc (sizrof(char)* (endIndex - startIndex) +2); //這裡加二是因為還要考慮字串末尾的零 int i; int index = 0; //複製子字串 for(i = startIndex; i <= endIndex; i++) tempString[index++] = str[i]; //用'\0'作為字串結尾 tempString[index] = '\0'; return tempString; }
void backTracking(char* str, int strLen, int startIndex) { if(startIndex >= strLen) { //將path拷貝到ans中 copy(); return ; }
int i; for(i = startIndex; i < strLen; i++) { //若從subString到i的子串是迴文字串,將其放入path中 if(isPalindrome(str, startIndex, i)) { path[pathTop++] = cutString(str, startIndex, i); } //若從startIndex到i的子串不為迴文字串,跳過這一層 else { continue; } //遞迴判斷下一層 backTracking(str, strLen, i + 1); //回溯,將path中最後一位元素彈出 pathTop--; } }
char*** partition(char* s, int* returnSize, int** returnColumnSizes){ int strLen = strlen(s); //因為path中的字串最多為strLen個(即單個字元的迴文字串),所以開闢strLen個char*空間 path = (char**)malloc(sizeof(char*) * strLen); //存放path中的陣列結果 ans = (char***)malloc(sizeof(char**) * 40000); //存放ans陣列中每一個char**陣列的長度 ansSize = (int*)malloc(sizeof(int) * 40000); ansTop = pathTop = 0;
//回溯函式 backTracking(s, strLen, 0);
//將ansTop設定為ans陣列的長度 *returnSize = ansTop; //設定ans陣列中每一個數組的長度 *returnColumnSizes = (int*)malloc(sizeof(int) * ansTop); int i; for(i = 0; i < ansTop; ++i) { (*returnColumnSizes)[i] = ansSize[i]; } return ans; }