leetcode 139. Word Break
一、问题描述
给定一个非空字符串s和一个包含非空单词列表的字典wordDict,确定s是否可以分割为一个或多个字典单词的空格分隔序列。注意:
1)字典中的相同单词可能会在分段中重复使用多次。
2)假设字典中不包含重复的单词。
【举例】
<例 1>
输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
<例 2>
输入: s = "applepenapple", wordDict = ["apple", "pen"]
输出: true
<例 3>
输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
输出: false
二、解题思路
设f(i)表示s[0,,,i]是否可被分割---即s中长度为i的子串能否被分割状态转移方程为:
f( i ) = f( j ) && s[ j+1 , i ] ∈ dict
边界:空串视为可以分割---f(0)=true
三、解题算法
/**************************************************** Author:tmw date:2018-5-29 ****************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> //截取子串 char* substr(char* str, int i, int len) { int m; int k=0; char* temp=(char*)malloc(strlen(str)*sizeof(char)); for(m=i;m<len;m++) temp[k++] = str[m]; temp[k]='\0'; return temp; } //截取的子串与dict中的所有字符串匹配 bool find_str(char* str, char** wordDict, int wordDictSize) { int i; for(i=0; i<wordDictSize; i++) { if( strcmp(str,wordDict[i])==0 ) return true; } return false; } bool wordBreak(char* s, char** wordDict, int wordDictSize) { int i,j; int len_s = strlen(s); bool f[len_s+1]; for(i=0; i<len_s+1; i++) f[i]=false; f[0] = true; for( i=1; i<=len_s; i++ ) { for( j=i-1; j>=0; j-- ) { if( f[j] && find_str( substr(s,j,i), wordDict, wordDictSize ) ) { f[i] = true; break; } } } return f[len_s]; }
四、执行结果
leetcode accept
梦想还是要有的,万一实现了呢~~~~ヾ(◍°∇°◍)ノ゙~~~~