class Solution {
public:
vector<string> shortestSubstrings(vector<string>& arr) {
vector<string> shortestSubstrings(arr.size(), "");
unordered_map<string, int> countPerSubstring{};
// for each word in arr
for(int ii=0; ii<arr.size(); ++ii)
{
// for each word in arr make an unordered_set of all the substrings
unordered_set<string> subStringsForii{};
for(int jj=0; jj<arr[ii].size(); ++jj)
{
// all substrings that start with arr[ii][kk]
// append substring with arr[ii][jj] as jj moves to the right.
string base = "";
for(int kk=jj; kk<arr[ii].size(); ++kk)
{
base += arr[ii][kk];
subStringsForii.insert(base);
}
}
// add each substring that was found in arr[ii] to the map of countPerSubstring
for(const string& s : subStringsForii)
{
++countPerSubstring[s];
}
}
for(int ii=0; ii<arr.size(); ++ii)
{
string shortestForWordAtii = "";
for(int jj=0; jj<arr[ii].size(); ++jj)
{
string base = "";
for(int kk=jj; kk<arr[ii].size(); ++kk)
{
base += arr[ii][kk];
if(countPerSubstring[base]== 1)
{
if(shortestForWordAtii == "")
{
shortestForWordAtii = base;
}
else if(base.size() < shortestForWordAtii.size())
{
shortestForWordAtii = base;
}
else if(base.size() == shortestForWordAtii.size() && base < shortestForWordAtii)
{
shortestForWordAtii = base;
}
}
}
}
shortestSubstrings[ii] = shortestForWordAtii;
}
return shortestSubstrings;
}
};