@ 代码随想录算法训练营第8周(C语言)|Day51(动态规划)

时间:2024-02-20 12:43:51

@ 代码随想录算法训练营第8周(C语言)|Day51(动态规划)

Day51、动态规划(包含题目 139.单词拆分 )

139.单词拆分

题目描述

给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。

题目解答

char* substring(int j,int i,char*s){
    int len=i-j;
    char*ret=(char*)malloc(sizeof(char)*(len+1));
    for(int z=0;z<len;z++ ){
        ret[z]=s[++j];
    }
    ret[len]='\0';
    return ret;
}
bool comparestring(char **wordDict,char*s,int wordDictSize){
    for(int i=0;i<wordDictSize;i++){
        if(strcmp(wordDict[i],s)==0){
            return true;
        }
    }
    return false;
}

bool wordBreak(char* s, char** wordDict, int wordDictSize) {
    int len=strlen(s);
    int dp[len+1];
    char s1[len+1];
    for(int i=1,j=0;i<=len;i++){
        s1[i]=s[j++];
        dp[j]=0;
    }
    dp[0]=1;
    for(int i=1;i<=len;i++){
        for(int j=0;j<i;j++){
            char*ret=substring(j,i,s1);
            if(comparestring(wordDict,ret,wordDictSize)&&dp[j]==1){
                dp[i]=1;
            }
        }
    }

    if(dp[len]==1){
        return true;
    }
    return false;
}

题目总结

多重背包问题。