My attempt:
First we define the existing row, using dots to represent empty squares, and our hand of 7 letters.
row="...t.t...r..e..";
letters="aodalip";
Next define a function to count how many times each of our letters appears in a given string. Also run this function on our letters, to count how many of each we have.
lettercount[str_]:=StringCount[str,#]&/@Characters[letters];
mylettercounts=lettercount[letters];
Next consider where our new word could start and finish. It can't start immediately to the right of an existing letter, nor can it finish immediately to the left of an existing letter.
cantstarthere=StringPosition[row,Except["."]][[All,1]]+1;
startpoints=Complement[Range[14],cantstarthere];
cantendhere=cantstarthere-2;
endpoints=Complement[1+Range[14],cantendhere];
Now that we have the list of valid start and end points, construct a list of substrings of row
that could become our new word. It is also handy to keep note of what the start point is for each one. An additional constraint is that our new word must include one of the existing letters, so we remove any substrings of row
which are all dots.
subrows=Flatten[Table[{m,StringTake[row,{m,n}]},{m,startpoints},{n,Select[endpoints,#>m&]}],1];
subrows=Select[subrows,Not@StringMatchQ[#[[2]],"."..]&];
Now convert each substring of row
into a regular expression, replacing each dot with ([any of our letters]).
starts=subrows[[All,1]];
regexes=StringReplace[subrows[[All,2]],"."->"(["<>letters<>"])"];
Next we search the dictionary for any words matching the regular expression. A slight wrinkle is that we might have used one of our letters twice, so we use the regular expression again in StringCases
to pick out which letters were used to match the ([any of our letters]) templates. We use this information to weed out any words which we can't actually make.
results=Table[
reg=regexes[[j]];
possiblewords=DictionaryLookup[RegularExpression[reg]];
lettersused=Flatten[StringCases[#,RegularExpression[reg]->"$1$2$3$4$5$6$7"]&/@possiblewords];
okay=(Max[(lettercount[#]-mylettercounts)]<1)&/@lettersused;
{starts[[j]],Pick[possiblewords,okay]}
,{j,Length[regexes]}];
Finally do a bit of tidying up, and present the words we can make along with their start points.
Column[DeleteDuplicates[Flatten[#]]&/@SplitBy[Select[results,#[[2]]!={}&],First]/.{a_Integer,b__}:>Rule[a,{b}]]
1->{dolt,plot}
2->{apt,dot,lit,lot,oat,opt,pat,pit,pot}
3->{at,it}
4->{tat,tot,total}
6->{ta,ti,to,tad,tap,til,tip,top,tapir}
8->{air,oar,par,lard,lira,lord,para,parade,parole,paroled}
9->{or,pro,drape,pride,prole}
10->{rape,ride,rile,ripe,rode,role,rope,raped,riled,riped,roped}
12->{lea,led,lei,pea,deal,deli,lead,leap,peal}