Word Break

来源:互联网 发布:工商信息查询网大数据 编辑:程序博客网 时间:2024/04/30 23:52

问题:

Given a string s and a dictionary of words dict, determine ifs can be segmented into a space-separated sequence of one or more dictionary words.

For example, given
s = "leetcode",
dict = ["leet", "code"].

Return true because "leetcode" can be segmented as "leet code".

解析:字典比对字符串的子序列是否在其中,之后看符合的子序列是否能完整的构成一个s。思路很简单:

1.用一个二维int数组judge[i][j]表示能构成word的子序列。可以使用judg[i][j]=1表示从i到j为有效word。本程序中使用的是judge[i]里面的直接加入从i来开始的有效词的end位置。

2.递归判断是否存在从起始位置到end的有效路径。

class Solution {bool m_flag = false;int **judge;int *size; void addResult(string str, int start) //递归判断 { if(start == str.length()) {m_flag = true; } else { for(int k = 0; k < size[start]; k++) { int end = judge[start][k];addResult(str, end+1); } } }public: bool wordBreak(string s, unordered_set<string> &dict)  { if(s.length() == 0 || dict.size() == 0) return m_flag; int len = s.length(); judge = new int*[len]; size = new int[len]; memset(size, 0, len*sizeof(int)); bool flag = false; for(int i = 0; i < len; i++) //构建judge[i][j] { judge[i] = new int[len];  for(int j = i; j < len; j++) { if(dict.find(s.substr(i, j - i + 1)) != dict.end()) {  judge[i][size[i]++] = j; if(j+1 == len) flag = true; } } } if(flag == true) // 可能存在addResult(s,0); for(int i = 0; i < len; i++) delete judge[i]; delete judge; delete size; return m_flag;}};



0 0
原创粉丝点击