This code snippet from another of my projects may help
integer like(string arg1, string arg2)
{
float tmpx; float tmpy;
if(llGetSubString(arg2,0,0)=="%"){arg2=llGetSubString(arg2,1,-1);tmpy=1;}
if(llGetSubString(arg2,llStringLength(arg2)-1,-1)=="%")
{arg2=llGetSubString(arg2,0,llStringLength(arg2)-2);tmpy=tmpy+2;}
if(-1!=(tmpx=llSubStringIndex(arg1,arg2)))
{
if((tmpy==0 && llStringLength(arg1)==llStringLength(arg2))
||(tmpy==1 && tmpx == (llStringLength(arg1)- llStringLength(arg2)))
||(tmpy==2 && tmpx == 0)
||(tmpy==3))
{return TRUE;}
}
return FALSE;
}
It emulates the SQL LIKE function (well partially) so to use it you pass a value and a mask.
To use your example:
like("Susie", "Sus%"

will return true, for any value Starting with "Sus"
like("Susie", "%Sus%"

will return true, for any value containing "Sus"
like("Susie", "%Sus"

will return false, this case is looking for a string ending in "Sus".
If you loop through your list passing the value and the mask it will allow you to find which names are a valid match.
Hope it helps
edit:
I forgot to mention that:
like("Susie", "Sus"

will return false, this case is looking for a string matching only "Sus".
tmpx and tmpy can be integer, in my case they are float as they are used for more advanced comparissons later in the code I use, but as you only ascked for partial string matching, I left out all the numeric stuff
