Leetcode241. 为运算表达式设计优先级(C语言)

Leetcode241. 为运算表达式设计优先级(C语言)

算法-分治:算法与数据结构参考

题目:
给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +, - 以及 * 。例:
输入: “2-1-1”
输出: [0, 2]

解释:
((2-1)-1) = 0
(2-(1-1)) = 2

思路:
分治。找出运算符,运算符左右字串分别进行递归运算,再进行总计算。

代码:

/**

Note: The returned array must be malloced, assume caller calls free().
*/
int* diffWaysToCompute(char * input, int* returnSize){
    if(!input){
        *returnSize = 0;
        return NULL;
    }

    int len = strlen(input);
    int *ret = (int *)malloc(sizeof(int));			//最后结果

    int mid = 0,cnt = 0,flag = 0,lsize = 0,rsize = 0;
    	//mid:运算符;cnt:总元素个数计数;flag:是否经过循环(由于左右字串递归,只能由此判断是否字串只有一个元素);lsize,rsize:mid左右元素个数
    char *lstr=(char *)malloc(len*sizeof(char));
    char *rstr=(char *)malloc(len*sizeof(char));	//运算符左右字串
 
    while(mid < len){
        if(input[mid] >= '0' && input[mid] <= '9'){		//使mid不是数字,(使mid遍历到运算符)
            mid++;
            continue;				//结束本次循环,进入下一个while
        }
        
        flag = 1;
        memcpy(lstr, input, mid);
        lstr[mid] = '\0';
        memcpy(rstr, input+mid+1, len-mid-1);
        rstr[len-mid-1] = '\0';		//进行左右字串赋值,注意结束符

        int *lret = diffWaysToCompute(lstr, &lsize);
        int *rret = diffWaysToCompute(rstr, &rsize);	//左右字串递归计算

        int *tmp = (int *)realloc(ret, (cnt+lsize*rsize)*sizeof(int));
        ret = tmp;					//加入了左右字串,每次按需重分配存储空间
        for(int i = 0; i < lsize; i++){		//由于递归,子计算左右字串长度均为1
            for(int j = 0; j < rsize; j++){
                switch(input[mid]){
                    case '+':
                        ret[cnt++] = lret[i]+rret[j];
                        break;
                    case '-':
                        ret[cnt++] = lret[i]-rret[j];
                        break;
                    case '*':
                        ret[cnt++] = lret[i]*rret[j];
                        break;
                    default:
                        break;
                }
            }
        }
        mid++;       
    }
    
    if(flag == 0){				//只有一个元素(mid=len,未进入循环)
        *returnSize = 1;
        ret[0] = atoi(input);	//输出数组形式,char转换int
        return ret;
    }

    *returnSize = cnt;
    return ret;
}

你可能感兴趣的:(数据结构&算法)