The first case is easy enough using PATINDEX.
Case 1:
select Id, PATINDEX('%TCTGTTCTG%', strings) FROM table
That should return the Id of all 'Full' matches and the starting position of the match.
Case 2:
select id, PATINDEX('%T%C%T%G%T%T%C%T%G%', strings) FROM table
This one appears to return a value for partial match, does not select 'Best' partial match)
Will get back to it when I can, lots of edge cases from what I see. (Edge cases: What if there are multiple full matches, do you need to return a match with the least amount of gap in it or just a match with gaps? Same goes for partial matches)
That should give you a start, while I think about the rest of it.