예제 #1
0
bool valid(tr1::unordered_set<string> const& st, sbmt::fat_syntax_rule const& r)
{
    vector<string> v; keys(*r.lhs_root(),v);
    BOOST_FOREACH(string const& vv, v) {
        if (st.find(vv) == st.end()) return false;
    }
    return true;
}
    bool wordSegmentation(string s, tr1::unordered_set<string> &dict) {
        // write your code here
        if (s.size() == 0)
        {
        	return true;
        }
    	vector<bool> res;

    	res.push_back(true);

    	int maxWordLen = 0;
    	for (tr1::unordered_set<string>::iterator i = dict.begin();
    		 i != dict.end(); i++)
    	{
    		int curSize = (*i).size();
    		if (curSize > maxWordLen)
    		{
    			maxWordLen = curSize;
    		}
    	}

    	//cout << "maxWordLen is " << maxWordLen << endl;

    	for (int i = 0; i < s.size(); i++)
    	{
    		bool seged = false;
    		for (int j = (i - maxWordLen > 0) ? (i - maxWordLen) : 0; j <= i; j++)
    		{
    			string subs = s.substr(j, i - j + 1);
    			tr1::unordered_set<string>::const_iterator got = dict.find(subs);
    			if (got != dict.end())
    			{
		    		if (res[j])
		    		{
		    			seged = true;
			    		break;
			    	}
		    	}
	    	}
	    	if (seged)
	    	{
	    		res.push_back(true);
	    	}
	    	else
	    	{
	    		res.push_back(false);
	    	}
    	}

  //   	int lastSegedPos = -1;
		// for(int i = 0; i < s.size(); i++)
		// {
		// 	string subs = s.substr(lastSegedPos + 1, i - lastSegedPos);
		// 	cout << "current i is " << i << endl;
		// 	cout << "subs is " << subs << endl;
		// 	tr1::unordered_set<string>::const_iterator got = dict.find(subs);
		// 	if (got != dict.end())
		// 	{
		// 		cout << "lastSegedPos changed from " << lastSegedPos << " to " << i << endl;
		// 		res.push_back(true);
		// 		lastSegedPos = i;
		// 	}
		// 	else
		// 	{
		// 		res.push_back(false);
		// 	}
		// }  

    	// for (int i = 0; i < s.size(); i++)
    	// {
    	// 	bool seged = false;
    	// 	for (int j = 0; j <= i; j++)
    	// 	{
    	// 		string subs = s.substr(j, i - j + 1);
    	// 		tr1::unordered_set<string>::const_iterator got = dict.find(subs);
    	// 		if (got != dict.end())
    	// 		{
		   //  		if (res[j])
		   //  		{
		   //  			seged = true;
			  //   		break;
			  //   	}
		   //  	}
	    // 	}
	    // 	if (seged)
	    // 	{
	    // 		res.push_back(true);
	    // 	}
	    // 	else
	    // 	{
	    // 		res.push_back(false);
	    // 	}
    	// }

    	return res[s.size()];
    }