华为OJ 在字符串中找出连续最长的数字串

来源:互联网 发布:日本动画公司排行知乎 编辑:程序博客网 时间:2024/05/24 00:35

第一种算法 O(n*n),时间超时了。不过答案是对的。

第二种算法 O(nlogn),时间OK,AC通过了。

#include <stdlib.h>#include <string.h>#include <iostream>//#include "oj.h"using namespace std;/* 功能:在字符串中找出连续最长的数字串,并把这个串的长度返回函数原型:   unsigned int Continumax(char** pOutputstr,  char* intputstr)输入参数:   char* intputstr  输入字符串输出参数:   char** pOutputstr: 连续最长的数字串,如果连续最长的数字串的长度为0,应该返回空字符串   pOutputstr 指向的内存应该在函数内用malloc函数申请,由调用处负责释放返回值:  连续最长的数字串的长度 */unsigned int Continumax(char** pOutputstr,  char* intputstr){int len=strlen(intputstr);int begin,end; //数字串的位置标记 int sub_len=0; //记录连续数字串长度 int sub_len_max=0;for(int i=0;i<len;i++){int j=i;if(intputstr[i]<'0' || intputstr[i]>'9') //若第一个字符非数字,则直接检测下一个字符     continue;    while(intputstr[j]>='0' && intputstr[j]<='9'){sub_len++;j++; }if(sub_len>=sub_len_max) //不断更新最大长度,以及位置 {begin=i;end=j;sub_len_max=sub_len;}sub_len=0;  }//cout<<"position: "<<begin<<" "<<end<<endl;char *ptr=(char *)malloc(sub_len_max+1); *pOutputstr=ptr;    int k;int m=0;for(k=begin;k<=end-1;k++){*((*pOutputstr)+m)=*(intputstr+k);m++;}*((*pOutputstr)+m)=0; //终止符 return sub_len_max;}int main(){char* intputstr = "12345abcd23456awe" ;char *pOutputstr = NULL; unsigned int nLength = Continumax(&pOutputstr, intputstr);cout<<nLength<<endl;if(pOutputstr==NULL)    cout<<"pout is null"<<endl;    else         cout<<"not null"<<endl;        cout<<"pOutputstr="<<pOutputstr<<endl;free(pOutputstr);}



第二种方法:

#include <stdlib.h>#include <string.h>#include <iostream>//#include "oj.h"using namespace std;/* 功能:在字符串中找出连续最长的数字串,并把这个串的长度返回函数原型:   unsigned int Continumax(char** pOutputstr,  char* intputstr)输入参数:   char* intputstr  输入字符串输出参数:   char** pOutputstr: 连续最长的数字串,如果连续最长的数字串的长度为0,应该返回空字符串   pOutputstr 指向的内存应该在函数内用malloc函数申请,由调用处负责释放返回值:  连续最长的数字串的长度 */unsigned int find_cross_mid(char *intputstr,int sub_begin,int mid,int sub_end,int *begin,int *end){int left_max=0;int right_max=0;int max=0;int i=mid,j=mid+1;if( (intputstr[i]<'0' || intputstr[i]>'9')&&(intputstr[j]<'0' || intputstr[j]>'9') ){    return 0;}     while(intputstr[i]>='0' && intputstr[i]<='9'){left_max++;i--;}while(intputstr[j]>='0' && intputstr[j]<='9'){right_max++;j++;}max=left_max+right_max;    *begin=i+1;    *end=j-1;        return max;}int find_digit_subarray(char *intputstr,int sub_begin,int sub_end,int *begin,int *end){int maxLength=0;int tempLength=0;    if(sub_begin>sub_end)    return 0;else if(sub_begin==sub_end){if(intputstr[sub_begin]>='0' && intputstr[sub_begin]<='9')    return 1;else    return 0;  }else{int mid=(sub_begin+sub_end)/2; //中间位置 int left_begin,left_end,left_max;int right_begin,right_end,right_max;int cross_begin,cross_end,cross_max;left_max=find_digit_subarray(intputstr,sub_begin,mid,&left_begin,&left_end);right_max=find_digit_subarray(intputstr,mid+1,sub_end,&right_begin,&right_end);cross_max=find_cross_mid(intputstr,sub_begin,mid,sub_end,&cross_begin,&cross_end);if(right_max>=left_max && right_max>=cross_max){*begin=right_begin;*end=right_end;return right_max;}else if(cross_max>=left_max && cross_max>=right_max){*begin=cross_begin;*end=cross_end;return cross_max;}else{*begin=left_begin;*end=left_end;return left_max;}}}unsigned int Continumax(char** pOutputstr,  char* intputstr){int len=strlen(intputstr);int begin=0,end=0; //数字串的位置标记 int sub_len_max=0;    sub_len_max=find_digit_subarray(intputstr,0,len-1,&begin,&end);    char *ptr=(char *)malloc(sub_len_max+1);    *pOutputstr=ptr;        if(sub_len_max==0)    {    *(*pOutputstr)=0;    return 0;    }        int k;int m=0;for(k=begin;k<=end;k++){*((*pOutputstr)+m)=*(intputstr+k);m++;}*((*pOutputstr)+m)=0; //终止符     return sub_len_max;}int main(){char* intputstr = "abc12345abc45678abc98765" ;char *pOutputstr = NULL; unsigned int nLength = Continumax(&pOutputstr, intputstr);cout<<nLength<<endl;if(pOutputstr==NULL)    cout<<"pout is null"<<endl;    else         cout<<"not null"<<endl;        cout<<"pOutputstr="<<pOutputstr<<endl;free(pOutputstr);}




0 0
原创粉丝点击