1. 程式人生 > >Word Break II

Word Break II

dp+dfs

class Solution {
private: //DFS path build function
	void buildPath(vector<bool>& isBreakable, string &s, int pos, vector<string> &res, string curP, vector<string>& wordDict, int minlen, int maxlen)
	{
		int i, len = s.size();
		for (i = minlen; i <= min(maxlen, len - pos); ++i)
		{
			string sTmp = s.substr(pos, i);
			if (isBreakable[pos + i] && find(wordDict.begin(), wordDict.end(), sTmp) != wordDict.end())
			{
				if (pos + i == len) 
					res.push_back(curP + s.substr(pos, i));
				else
					buildPath(isBreakable, s, pos + i, res, curP + s.substr(pos, i) + " ", wordDict, minlen, maxlen);
			}
		}
			
	}

public:
	vector<string> wordBreak(string s, vector<string>& wordDict) {
		int sSize = s.size(), len, i, minlen = INT_MAX, maxlen = INT_MIN;
		vector<string> res;
		vector<bool> isBreakable(sSize + 1, false);

		for (string &word : wordDict) { // find the minimum and maximum word length 
			minlen = min(minlen, (int)word.size());
			maxlen = max(maxlen, (int)word.size());
		}
		//DP to build isBreakable
		for (i = sSize - minlen, isBreakable[sSize] = true; i >= 0; --i)
			for (len = minlen; len <= min(maxlen, sSize - i); ++len)
			{
				string sTmp = s.substr(i, len);
				if (isBreakable[i + len] && find(wordDict.begin(),wordDict.end(),sTmp)!=wordDict.end()) 
				{ 
					isBreakable[i] = true;
					break; 
				}
			}
		//if breakable, do DFS path building
		if (isBreakable[0]) 
			buildPath(isBreakable, s, 0, res, "", wordDict, minlen, maxlen);
		return res;
	}
};