您的位置:首页 > Web前端

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

2015-08-11 19:38 429 查看
这道题有点像矩阵连乘问题



主要参考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 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: