39. 组合总和
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
int* path;
int path_top;
int** res;
int res_top;
void backtracking(int target,int sum,int* candidates,int candidatesSize,int **returnColumnSizes,int start_index){
if(sum>target) return;//剪枝
if(sum==target){
int* temp=(int*)calloc(path_top,sizeof(int));
for(int i=0;i<path_top;i++){
temp[i]=path[i];
}
(*returnColumnSizes)[res_top]=path_top;
res[res_top++]=temp;
}
for(int i=start_index;i<candidatesSize;i++){//i=start_index而非i=0
path[path_top++]=candidates[i];
sum+=candidates[i];
backtracking(target,sum,candidates,candidatesSize,returnColumnSizes,i);//元素可重复选取→传入i而非i+1
sum-=candidates[i];
path_top--;
}
}
int** combinationSum(int* candidates, int candidatesSize, int target, int* returnSize, int** returnColumnSizes) {
path=(int*)calloc(100,sizeof(int));
path_top=0;
res=(int**)calloc(150,sizeof(int*));
res_top=0;
(*returnColumnSizes)=(int*)calloc(150,sizeof(int));
(*returnSize)=0;
backtracking(target,0,candidates,candidatesSize,returnColumnSizes,0);
(*returnSize)=res_top;
return res;
}
40.组合总和II
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
int* path;
int path_top;
int** res;
int res_top;
int* used;
int cmp(const void* str1,const void* str2){//记
return (*((int*)str1))>(*((int*)str2));
}
void backtracking(int target,int sum,int* candidates,int candidatesSize,int **returnColumnSizes,int start_index){
if(sum>target) return;//剪枝
if(sum==target){
int* temp=(int*)calloc(path_top,sizeof(int));
for(int i=0;i<path_top;i++){
temp[i]=path[i];
}
(*returnColumnSizes)[res_top]=path_top;
res[res_top++]=temp;
return;
}
for(int i=start_index;i<candidatesSize;i++){//i=start_index而非i=0
if(i>0&&candidates[i]==candidates[i-1]&&used[i-1]==0) continue;
//used[i-1]==0而不是used[i]==0
used[i]=1;
path[path_top++]=candidates[i];
sum+=candidates[i];
backtracking(target,sum,candidates,candidatesSize,returnColumnSizes,i+1);
sum-=candidates[i];
path_top--;
used[i]=0;
}
}
int** combinationSum2(int* candidates, int candidatesSize, int target, int* returnSize, int** returnColumnSizes) {
qsort(candidates,candidatesSize,sizeof(int),cmp);//先排序
path=(int*)calloc(30,sizeof(int));
path_top=0;
res=(int**)calloc(100,sizeof(int*));
res_top=0;
(*returnColumnSizes)=(int*)calloc(100,sizeof(int));
used=(int*)calloc(candidatesSize,sizeof(int));
(*returnSize)=0;
backtracking(target,0,candidates,candidatesSize,returnColumnSizes,0);
(*returnSize)=res_top;
//allocator_may_return_null=1;
return res;
}
131.分割回文串
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
char** path;
int path_top;
char*** res;
int res_top;
bool is_palindrome(char* s,int start,int end){//判断是否为回文串
while(start<end){
if(s[start]!=s[end]) return false;
start++;
end--;
}
return true;
}
void backtracking(char*s,int len,int** returnColumnSizes,int start_index){
if(start_index>=len){
char** temp_path=(char**)calloc(path_top,sizeof(char*));
int i=0;
for(;i<path_top;i++){
temp_path[i]=path[i];
}
(*returnColumnSizes)[res_top]=i;
res[res_top++]=temp_path;
}
for(int i=start_index;i<len;i++){//单层逻辑,对主串进行切割
if(is_palindrome(s,start_index,i)){//判断主串切割出的字符串是否为回文串
char* temp=(char*)calloc(17,sizeof(char));//要多申请1个空间放'\0' ;申请题目字符串最大长度再多加1个
int k=0;
for(int j=start_index;j<=i;j++){
temp[k++]=s[j];
}
path[path_top++]=temp;
}
else continue;//不是回文串则不用再判断其子串是否为回文串
backtracking(s,len,returnColumnSizes,i+1);//起点右移一位作为新的主串
path_top--;
}
}
char*** partition(char* s, int* returnSize, int** returnColumnSizes) {
path=(char**)calloc(100000,sizeof(char*));
path_top=0;
res=(char***)calloc(100000,sizeof(char**));
res_top=0;
(*returnColumnSizes)=(int*)calloc(100000,sizeof(int));
(*returnSize)=0;
int len=strlen(s);
backtracking(s,len,returnColumnSizes,0);
//printf("res_top=%d",res_top);
(*returnSize)=res_top;
return res;
}