389.違いを見つける
2つの文字列sとtが与えられた場合、それらには小文字のみが含まれます。
文字列tは文字列sによってランダムに再配置され、文字がランダムな位置に追加されます。
tに追加された文字を見つけてください。
例1:
入力:s = "abcd"、t = "abcde"
出力: "e"
説明:「e」は追加された文字です。
例2:
入力:s = ""、t = "y"
出力: "y"
例3:
入力:s = "a"、t = "aa"
出力: "a"
例4:
入力:s = "ae"、t = "aea"
出力: "a"
提示:
0 <= s.length <= 1000
t.length == s.length + 1
s 和 t 只包含小写字母
回答:
直感的には、ハッシュテーブルを使用して各配列文字の出現回数を格納し、出現回数を1つずつ比較できます。つまり、2つのハッシュテーブルを使用できます。1つのハッシュテーブルのみを使用して、配列は「保存」され、t配列は「削除」されます。
コード:
char findTheDifference(char * s, char * t){
int hash[26]={
0};
for(int i=0;i<strlen(s);i++)
{
hash[s[i]-'a']++;
}
for(int i=0;i<strlen(t);i++)
{
hash[t[i]-'a']--;
}
char temp;
for(int i=0;i<26;i++)
{
if(hash[i]==-1)
{
temp = i+'a';
return temp;
}
}
return 1;
}
後で、最適化できるので、「保存」して「削除」してから比較する必要がないことがわかりました。削除できる場合は、比較処理を行ってください。違いが見つかったら、すぐに飛び出すことができます。また、これにより中間変数の温度も節約されます。
コード:
char findTheDifference(char * s, char * t){
int hash[26]={
0};
for(int i=0;i<strlen(s);i++)
{
hash[s[i]-'a']++;
}
for(int i=0;i<strlen(t);i++)
{
hash[t[i]-'a']--;
if(hash[t[i]-'a']==-1)
{
return t[i];
}
}
return 1;
}