2つの文字列を入力し、最初の文字列から2番目の文字列のすべての文字を削除します.

1299 ワード

たとえば、「They are students.」と入力します.「aeiou」と「aeiou」の場合、削除後の最初の文字列は「Thy r stdnts.」になります.
考え方:
遍歴により,1番目の文字列に2番目の文字列のi番目の文字が存在するか否かを順次判定し,存在する場合はその文字を削除するので,この方法の削除における時間的複雑度はO(n^2)である.
アルゴリズム全体の時間的複雑さは明らかに大きい.
スペースを時間に換算する方法:
文字列については、ASCIIコードのすべての記号が256個(拡張テーブルを含む)であるため、256文字が2番目の文字列に存在するか否かを表す配列を申請することができ、存在する場合は1とし、存在しない場合は0とする.同様に、ASCII値番号の下で配列が1であるか否かを問い合わせることで、削除するか否かを判定する.例:
最初のステップは、
2番目の文字列は「aeiou」であり、対応するasciiは97101105111117であり、すなわち、配列a[97]、a[101]、a[105]、a[111]、a[117]の値を1とし、その他は0とする必要がある.
2つ目のステップは、
最初の文字列「They are students.」を順に検索し、例えば、最初の文字が「T」であり、対応するASCIIコードが84であるため、a[84]の値を見ると0であることが判明するので、削除せず、同様に、このようにすればよい.最後の時間の複雑度はo(n)である.
#include 
#include 
#include 

void DeleteStr(char *str1, char *str2)
{
	char *pFast = str1;
	char *pSlow = str2;
	int a[256] = { 0 };
	int i;
	int n = strlen(str2);
	for (i = 0; i < n; i++)
	{
		a[str2[i]] = 1;
	}
	while (*pFast)
	{
		if (a[*pFast] == 0)
		{
			*pSlow = *pFast;
			pSlow++;
		}
		*pFast++;
	}
	*pSlow = '\0';
}

int main()
{
	char str1[] = "They are students.";
	char str2[] = "aeiou";
	DeleteStr(str1, str2);
	printf("%s
", str2); system("pause"); return 0; }