leetcode 524子序列匹配问题 字典序大小比较

char * findLongestWord(char * s, char ** dictionary, int dictionarySize){
    int p=-1;
    
    
    char *ans="";
    int len_of_s=strlen(s);
    int dp[len_of_s+1][26];
    for(int i=0;i<26;i++)
     dp[len_of_s][i]=len_of_s;

    for(int i=len_of_s-1;i>=0;i--)
    {
       for(int j=0;j<26;j++)
       {
           if((s[i]-'a')==j)
           {
               dp[i][j]=i;
           }
           else
           {
               dp[i][j]=dp[i+1][j];
           }
       }
    }

    //printf("%d\n",strlen(ans));
    for(int i=0;i<dictionarySize;i++)
    {
        printf("当前字符串为%s\n",dictionary[i]);

        int flag=1;
        int j=0;
        int index=0;
        int len_of_t=strlen(dictionary[i]);
        while(j<len_of_t)
        {
           //printf("j=%d,t[%d]=%c\n",j,j,t[j]);
           //printf("dp[0][0]=%d\n",dp[0][0]);
           if(dp[index][(dictionary[i][j]-'a')]<len_of_s)   //找到了
           {
              index=dp[index][(dictionary[i][j]-'a')]+1;
           }
           else
           {
               printf("不符合要求\n");
               flag=0;
               break;
           }
           //printf("111\n");
           j++;
        }
        if(flag==0)
           continue;
        printf("符合要求\n");
        //符合要求

        if(p==-1)
        {
            p=i;
        }
        else
        {
            if(strlen(dictionary[i])>strlen(dictionary[p]))
            {
               p=i;
            }
            else if(strlen(dictionary[i])==strlen(dictionary[p]))
            {
                if(strcmp(dictionary[i],dictionary[p])<0)
                {
                    p=i;
                }
            }
        }
        /*
        if(strlen(ans)==0)
        {
            ans=dictionary[i];
        }
        else
        {
            if(strlen(dictionary[i])>strlen(ans))
            {
               ans=dictionary[i];
            }
            else if(strlen(dictionary[i])==strlen(ans))
            {
                if(strcmp(dictionary[i],ans)<0)
                {
                    ans=dictionary[i];
                }
            }
        }
        */
    }
    /*
    if(ans==NULL)
       return NULL;

    return ans;
    */
    if(p==-1)
    return "";
    return dictionary[p];
}

优化过后

bool func(char*t,int len_of_s,int dp[][26])
{
    int j=0,index=0,len_of_t=strlen(t);
    while(j<len_of_t)
    {
        if(dp[index][(t[j]-'a')]<len_of_s)   
          index=dp[index][(t[j]-'a')]+1;
        else
            return false;
        j++;
    }
    return true;
}
char * findLongestWord(char * s, char ** dictionary, int dictionarySize){
    int p=-1,len_of_s=strlen(s),dp[len_of_s+1][26];
    for(int i=0;i<26;i++)
     dp[len_of_s][i]=len_of_s;

    for(int i=len_of_s-1;i>=0;i--)
    {
       for(int j=0;j<26;j++)
       {
           if((s[i]-'a')==j)
               dp[i][j]=i;
           else
               dp[i][j]=dp[i+1][j];
       }
    }
    for(int i=0;i<dictionarySize;i++)
    {
        if(func(dictionary[i],len_of_s,dp)
         &&(p==-1||strlen(dictionary[i])>strlen(dictionary[p])
            ||((strlen(dictionary[i])==strlen(dictionary[p]))
                 &&strcmp(dictionary[i],dictionary[p])<0)))
                         p=i;
    }
    if(p==-1)
       return "";
    return dictionary[p];
}

又遇到传递二维数组的问题 这里形参用dp[][26] 指明第二维维数解决

用一个指针 指向答案

bool func(char*t,int len_of_s,int dp[][26])
{
    int j=0,index=0,len_of_t=strlen(t);
    while(j<len_of_t)
    {
        if(dp[index][(t[j]-'a')]<len_of_s)   
          index=dp[index][(t[j]-'a')]+1;
        else
            return false;
        j++;
    }
    return true;
}
char * findLongestWord(char * s, char ** dictionary, int dictionarySize){
    int p=-1,len_of_s=strlen(s),dp[len_of_s+1][26];
    for(int i=0;i<26;i++)
     dp[len_of_s][i]=len_of_s;

    for(int i=len_of_s-1;i>=0;i--)
    {
       for(int j=0;j<26;j++)
       {
           if((s[i]-'a')==j)
               dp[i][j]=i;
           else
               dp[i][j]=dp[i+1][j];
       }
    }

    char* ans=(char*)malloc(1*sizeof(char));
    strcpy(ans,"");
    char* temp=ans;
    
    for(int i=0;i<dictionarySize;i++)
    {
        if(func(dictionary[i],len_of_s,dp)
          &&(strlen(dictionary[i])>strlen(ans)
           ||((strlen(dictionary[i])==strlen(ans))
               &&(strcmp(dictionary[i],ans)<0))))
        {
            ans=dictionary[i];
        }
    }
    if(strlen(ans)!=0)
       free(temp);
    return ans;
}

不能对一个没有分配空间char*指针使用strlen,首先得分配空间

这道题首先要解决子“序列”t是否在主序列s中,可以用两个指针的一般方法
也可以用动态规划的方法降低时间复杂度
对主序列s,长度为m
设dp[i][j]表示i到m-1中字符j的位置,这样指针遍历序列t时,就用dp来找s中的t[p]
在这里插入图片描述
来源 leetcode官方题解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值