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)である.
考え方:
遍歴により,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;
}