# Julia, <s>165</s> <s>155</s> 151 bytes <!-- language-all: lang-default --> s->(x=split(s,r"\W",keep=1<0);d=[];for i=1:(L=endof(x)),j=i+1:L lcfirst(x[i])[1]==lcfirst(x[j])[1]&&(d=[d;j])end;deleteat!(x,sort(∪(d)));join(x," ")) This is an anonymous function that accepts a string and returns a string. To call it, assign it to a variable. Ungolfed: function f(s) # Split on unwanted characters, omitting them from the array x = split(s, r"\W", keep=false) # Initialize an array to hold the indices of words to remove d = [] # Locate all indices for removal by checking the first letter # of each word against the first letters of the remaining words for i = 1:(L=endof(x)), j = i+1:L lcfirst(x[i])[1] == lcfirst(x[j])[1] && (d = [d; j]) end # Remove words from the array by index deleteat!(x, sort(∪(d))) # Join the array back into a string, separated by spaces return join(x, " ") end Saved 3 bytes thanks to Sp3000!