241 Different Ways to Add Parentheses(C代码版)

这道题有点像矩阵连乘问题
这里写图片描述
主要参考http://blog.csdn.net/pointbreak1/article/details/47315357的java版的代码

public class Solution {  
    public List<Integer> diffWaysToCompute(String input) {  
        List<Integer> result = new ArrayList<Integer>();  
        int val = 0, index = 0;  
        while(index < input.length() && Character.isDigit(input.charAt(index))) {  
            val *= 10;  
            val += input.charAt(index++) - '0';  
        }  
        if(index == input.length()) {  
            result.add(val);  
            return result;  
        }  

        for(int i = 0; i < input.length(); i++) {  
            if(!Character.isDigit(input.charAt(i))) {  
                List<Integer> left = diffWaysToCompute(input.substring(0, i));  
                List<Integer> right = diffWaysToCompute(input.substring(i+1, input.length()));  
                for(int j = 0; j < left.size(); j++) {  
                    for(int k = 0; k < right.size(); k++) {  
                        result.add(compute(left.get(j), right.get(k), input.charAt(i)));  
                    }  
                }  
            }  
        }  
        return result;  
    }  

    int compute(int a, int b, char op) {  
        switch(op) {  
            case '+': return a + b;  
            case '-': return a - b;  
            case '*': return a * b;  
            default: return 1;  
        }  
    }  
}  

自己实现的C代码如图所示

#include<stdbool.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int cmp(const void* i,const void* j){
    int* a = (int *) i ;
    int* b = (int *) j ;
    if(*a>*b)
        return 1 ;
    if(*a<*b)
        return -1 ;
    return 0 ;
}
bool isdigital(char symbol){
    if(symbol>='0'&&symbol<='9'){
        return true ;
    }
    return false ;
}

bool computeTerminate(char* input){
    int length = strlen(input) ;
    for(int i=0;i<length;i++){
        if(!isdigital(input[i]))
            return false ;
    }
    return true ;
}

char* subString(char* input,int start ,int end){
    char* temp = (char*)malloc(sizeof(char)*(end-start+1)) ;
    for(int i=0;i<(end-start);i++){
        temp[i] = input[start+i] ;
    }
    temp[end-start] = '\0' ;
    return temp ;
}

int computeResult(int a,int b,char op){
    switch(op){
        case '+': return a+b ;
        case '-': return a-b ;
        case '*': return a*b ;
    }
}

//左右递归,终止条件只包含一个数,不包含符号时
int* diffWaysToCompute(char* input,int* returnSize){
    //只包含了一个数
    if(computeTerminate(input)){    
//      result[*returnSize] = atoi(input) ;
//      (*returnSize)++ ;
//      return result ; 
        int* result = (int *)malloc(sizeof(int)*1) ;
        result[0] = atoi(input) ;
                *returnSize = 1 ;
                return result ;
    }

    int* result = (int *)malloc(sizeof(int)*1500) ;
    for(int i=0;i<strlen(input);i++){
        if(!isdigital(input[i])){
            int lSize = 0 ;
            int RSize = 0 ;
            char* left = subString(input,0,i) ;
            char* right = subString(input,i+1,strlen(input)) ;
            int* l = diffWaysToCompute(left,&lSize) ;
            int* r = diffWaysToCompute(right,&RSize) ;
            for(int j=0;j<lSize;j++)
                for(int k=0;k<RSize;k++){
                    result[*returnSize] = computeResult(l[j],r[k],input[i]) ;
                    (*returnSize)++ ;
                }
        }
    }
    int* temp = (int*)malloc(sizeof(int)*(*returnSize-1)) ;
    for(int i=0;i<*returnSize;i++){
        temp[i] = result[i] ;
    }
    free(result) ;
    //释放result所指向的空间----告诉系统,这个空间可以被重新分配了。此时result本身的值(即所指向的空间不变)
    //所以为了保证指针的安全性,通常都会在free(result);之后紧跟一句result=NULL,避免result再次操作到原来的空间。
    result = NULL ;
    return temp ;   
}

int main(void){
    char array[20] = "1-2+3*4-5*6-7+8*9" ; 
    int returnSize = 0 ;
    int* result = NULL ;
    result = diffWaysToCompute(array,&returnSize) ;
    qsort(result,returnSize,sizeof(int),cmp) ;
    for(int i=0;i<returnSize;i++){
        printf("%d ",result[i]) ;
    }
    printf("\n") ;
    return 0 ;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值