jak duże są te tablice?
jeśli więcej niż kilkanaście tysiecy elementów, to proponuję użyć Dictionary; wyszukiwanie w nim ma złożoność O(1), więc szybciej się nie da. robisz tak:
(0) dict[] indeksowany słowami z tablicy remove[], zawierający jakiekolwiek śmieci, ważny jest tylko indeks;
pusta tablica stringów allRem[] o długości all[];
int allRemLen z indeksem ostatniego pustego elementu z allRem;
pętla po all[], sprawdzenie czy konkretne słowa istnieją w dict[], jeśli nie, to dopisanie słowa do allRem na indeksie allRemLen i zwiekszenie allRemLen.
na koniec stworzenie nowej tablicy stringów o długości allRemLen, przepisanie do niej pierwszych allRemLen wartości z allRem[] i zwrócenie jej.
złożoność obliczeniowa - O(m+n), gdzie m - długość remove[], n - długość all[].
teraz inne rozwiązania:
(1) jeśli będziesz sprawdzał dla każdego słowa z all[] wszystkie słowa z remove[], to już masz O(mn). (2) jeśli słowa z remove[] posortujesz alfabetycznie i będziesz wyszukiwać binarnie, to O((m+n)logm). (3) jeśli po każdym znalezieniu słowa do usunięcia będziesz przesuwać wszystkie elementy tablicy, to dokładasz O(n), i to boleśnie długo trwające, bo przesuwasz spory kawałek pamięci.
opcja pesymistyczna (czyli zaimplementowanie Twojego rozwiązania - (1) i (3)): O(mnn), czyli dla tysiąca słów w all[] i setki z remove[] masz sto milionów iteracji pętli.
opcja średnia (imho dobra dla małej ilości elementów, bo obywa się bez liczenia hashy, a sortowanie i wyszukiwanie binarne potrwa szybko, bo logm) czyli (2) i dopisywanie do nowej tablicy jak w (0) - O((m+n)*logm+n), więc dla 100 i 1000 masz nieco ponad 6000 iteracji (plus na końcu pętla na wygenerowanie tablicy o odpowiedniej długości, czyli de facto ~7000).
opcja optymistyczna (0): O(m+n), czyli 1100 iteracji (plus jw - ~2100 iteracji).
tworzenie nowej tablicy i przepisywanie do niej kolejnych pasujących słów ma pewną wadę - pożera dwa razy więcej pamięci, natomiast zaoszczędza olbrzymiej ilości czasu potrzebnej na ciągłe przesuwanie elementów. ALE jeśli remove[] ma ich tylko kilka, a all[] też jest w miarę krótkie (kilkaset elementów), to spadek szybkości nie powinien być duży, za to zaoszczędzisz małą ilosć pamięci (bo mała wejściowa tablica all[]).