vector<string> letterCombinations(string digits) { vector<string> ret, alpha; if (digits.length() == 0) return ret; string n2s[10] = {" ","","abc","def","ghi","jkl" ,"mno","pqrs","tuv","wxyz"}; for (auto x : digits) { alpha.push_back(n2s[x-'0']); } cartesianProduct(ret, "", alpha); return ret; }
void cartesianProduct(vector<string> &ret, string foo , vector<string> &alpha) { int len=foo.length(), size=alpha.size(); if (len >= size) { ret.push_back(foo); return; } string sigma = alpha[len]; for (auto x : sigma) { string bar=foo; bar.push_back(x); cartesianProduct(ret, bar, alpha); } }
template <typename T> GenericFactor<T>& GenericFactor<T>::multiply (const GenericFactor<T>& g) { if (args_ == g.arguments()) { // optimization Globals::logDomain ? params_ += g.params() : params_ *= g.params(); return *this; } unsigned range_prod = 1; bool share_arguments = false; const std::vector<T>& g_args = g.arguments(); const Ranges& g_ranges = g.ranges(); const Params& g_params = g.params(); for (size_t i = 0; i < g_args.size(); i++) { size_t idx = indexOf (g_args[i]); if (idx == args_.size()) { range_prod *= g_ranges[i]; args_.push_back (g_args[i]); ranges_.push_back (g_ranges[i]); } else { share_arguments = true; } } if (share_arguments == false) { // optimization cartesianProduct (g_params.begin(), g_params.end()); } else { extend (range_prod); Params::iterator it = params_.begin(); MapIndexer indexer (args_, ranges_, g_args, g_ranges); if (Globals::logDomain) { for (; indexer.valid(); ++it, ++indexer) { *it += g_params[indexer]; } } else { for (; indexer.valid(); ++it, ++indexer) { *it *= g_params[indexer]; } } } return *this; }
const std::set<std::pair<T, U>> operator* (const std::set<T>& set1, const std::set<U>& set2) { return cartesianProduct(set1, set2); }